如何在Java Swing中实现可折叠/展开的JPanel

11

我希望有一个JPanel,当用户点击其边框上的文本/图标时,可以折叠或展开。由于我的应用程序空间不足,我需要这种类型的面板。

我了解到CollapsiblePanel类,但不确定如何使用它。我认为需要下载SwingX,但无法找到它。

此外,如果我能在基本的Java Swing中得到解决方案就更好了。


3
由于我的应用空间有限,我需要这种类型的面板。有其他方法可以在一个GUI中放置多个控件,例如JTabbedPaneJSplitPaneCardLayoutJDesktopPane/JInternalFrame,或者将额外的控件弹出到(可能是模态的)JDialogJOptionPane中可能更合适。 - Andrew Thompson
2
@AndrewThompson - 我们正在使用Swing,所以肯定有很多可能性,但是:JXCollapsible/JXTaskPane太可爱了 :-) - kleopatra
@kleopatra 我一直在等你来回答 OP 的实际问题。只是想让他们知道有很多可能性。 :) - Andrew Thompson
感谢Andrew的建议。我从SwingX中找到了我需要的东西。然而,仅使用Swing执行类似操作的谜团仍未解答。如果需要的话,我会再回来看看这个问题。谢谢大家!! - Nayan Soni
3个回答

11

我不确定你在哪里找过了,但即使考虑到我们所处的基础设施混乱,也不是那么难找到。

前往SwingX项目主页,然后按照第一段中的链接转到(简版)下载部分,一直找到releases\1.6.2。折叠面板本身没有什么特别之处,只是用于放置组件的容器。


协作。目前正在使用SwingX组件重新编写大部分GUI。可以节省约一半的代码以适应标准Swing组件。 - Mike Adler
谢谢kleopatra..我得到了SwingX库...已经导入并正在使用。喜欢JXTaskPane和JXCollapsible :) 尽管我还没有深入探索这两个面板。 我正在寻找类似于“JXTaskPane”和“JXCollapsible”的东西。然而,我更喜欢JXTaskpane而不是JXCollapsiblePane,因为可折叠的窗格需要一个外部触发器来展开和折叠。如果我错了,请纠正我。 - Nayan Soni

1

我认为你可以使用JSplitPane来解决你的问题。巧妙地利用设置分隔符位置的属性,你可以达到你想要的效果。


0

这里是一个纯粹使用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);
  }
}

我想尝试测试,但是你没有提交示例。请提供代码,展示你的解决方案如何工作。 - user7339033

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接