【问题标题】:How to have Collapsable/Expandable JPanel in Java Swing如何在 Java Swing 中拥有可折叠/可扩展的 JPanel
【发布时间】:2011-12-31 22:52:58
【问题描述】:

我想要一个当用户单击其边框上的文本/图标时可以折叠或展开的 JPanel。由于我的应用程序中的空间紧缩,我需要这种类型的面板。

我阅读了有关 CollapsiblePanel 类的信息,但不知道如何使用它。我认为需要下载 SwingX,但在任何地方都没有找到。

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

【问题讨论】:

  • “由于我的应用程序空间紧张,我需要这种类型的面板。” 还有其他方法可以在一个 GUI 中放置许多控件。 JTabbedPaneJSplitPaneCardLayoutJDesktopPane/JInternalFrame .. 或者,在(可能是模态的)JDialogJOptionPane 中弹出额外的控件可能更有意义。跨度>
  • @AndrewThompson - 我们在 Swing 上,所以肯定有很多可能性,但是:JXCollapsible/JXTaskPane 太可爱了 :-)
  • @kleopatra 我在等你过来解决 OP 的 actual 问题。只是想我会让他们意识到有很多可能性。 :)
  • 感谢安德鲁的意见。我从 SwingX 得到了我想要的东西。然而,仅使用 Swing 执行类似操作的谜团仍未得到解答。如果需要,会回到这个。谢谢大家!

标签: java swing jpanel expand collapse


【解决方案1】:

不确定你在哪里看,但它并不难 - 即使考虑到我们所处的基础设施混乱;-)

转到SwingX 的项目主页,然后按照第一段中的链接到(准系统)下载部分,下到版本\1.6.2。可折叠物品本身没有什么特别之处,只是将组件放入的容器。

【讨论】:

  • 同意。目前使用 SwingX 组件重写我们的大部分 GUI。为标准 Swing 组件的适配节省了大约一半的代码。
  • 感谢 kleopatra .. 我得到了 SwingX 库...已导入并正在使用。喜欢 JXTaskPane 和 JXCollapsible :) 还没有深入探索这两个窗格。我一直在寻找类似于“JXTaskPane”和“JXCollapsible”的东西。然而,比起 JXCollapsiblePane,更喜欢 JXTaskpane,因为可折叠窗格需要 外部触发器 来展开和折叠。如果我错了,请纠正我。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    所以这里有一个纯在 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);
      }
    }
    

    【讨论】:

    • 我正在尝试测试,但您没有提交示例。请输入代码,您的解决方案是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多