如何在Java Swing中使用可折叠/可展开的JPanel

dgenwo3n  于 2022-11-20  发布在  Java
关注(0)|答案(3)|浏览(178)

我想要一个JPanel,当用户点击它的边框上的文本/图标时可以折叠或展开。我需要这种类型的面板,因为我的应用程序中的空间紧缩。
我读过关于CollapsiblePanel类的文章,但不知道如何使用它。我认为SwingX需要下载,但在任何地方都没有找到。
而且,如果我用基本的JavaSwing来得到这个问题的解决方案,那就更好了。

dz6r00yl

dz6r00yl1#

不知道你在哪里找过,但它并不是那么难找到--即使我们的基础设施一团糟;- )
转到SwingX的项目主页,然后按照第一段中的链接转到(准系统)下载部分,一直到releases\1.6.2。可折叠组件本身没有什么特别之处,只是放置组件的容器。

a8jjtwal

a8jjtwal2#

我认为您可以使用JSplitPane来解决您的问题。利用该属性明智地设置分隔符的位置,您可以实现您想要的。

j1dl9f46

j1dl9f463#

所以这里有一个纯粹用Swing编写的小类:)这个实现假设标题在左上角...

import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JCollapsiblePanel extends JPanel {
  private TitledBorder border;
  private Dimension visibleSize;
  private boolean collapsible;

  public JCollapsiblePanel(String title, Color titleCol) {
    super();

    collapsible = true;

    border = new TitledBorder(title);
    border.setTitleColor(titleCol);
    border.setBorder(new LineBorder(Color.white));
    setBorder(border);

    // as Titleborder has no access to the Label we fake the size data ;)
    final JLabel l = new JLabel(title);
    Dimension size = l.getPreferredSize();

    addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        if (!collapsible) {
          return;
        }

        Insets i = getBorder().getBorderInsets(JCollapsiblePanel.this);
        if (e.getX() < i.left + size.width && e.getY() < i.bottom + size.height) {
          if (visibleSize == null || getHeight() > size.height) {
            visibleSize = getSize();
          }
          if (getSize().height < visibleSize.height) {
            setMaximumSize(new Dimension(visibleSize.width, 20000));
            setMinimumSize(visibleSize);
          } else {
            setMaximumSize(new Dimension(visibleSize.width, size.height));
          }
          revalidate();
          e.consume();
        }
      }
    });
  }

  public void setCollapsible(boolean collapsible) {
    this.collapsible = collapsible;
  }

  public void setTitle(String title) {
    border.setTitle(title);
  }
}

相关问题