我想要一个JPanel,当用户点击它的边框上的文本/图标时可以折叠或展开。我需要这种类型的面板,因为我的应用程序中的空间紧缩。我读过关于CollapsiblePanel类的文章,但不知道如何使用它。我认为SwingX需要下载,但在任何地方都没有找到。而且,如果我用基本的JavaSwing来得到这个问题的解决方案,那就更好了。
dz6r00yl1#
不知道你在哪里找过,但它并不是那么难找到--即使我们的基础设施一团糟;- )转到SwingX的项目主页,然后按照第一段中的链接转到(准系统)下载部分,一直到releases\1.6.2。可折叠组件本身没有什么特别之处,只是放置组件的容器。
a8jjtwal2#
我认为您可以使用JSplitPane来解决您的问题。利用该属性明智地设置分隔符的位置,您可以实现您想要的。
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); } }
3条答案
按热度按时间dz6r00yl1#
不知道你在哪里找过,但它并不是那么难找到--即使我们的基础设施一团糟;- )
转到SwingX的项目主页,然后按照第一段中的链接转到(准系统)下载部分,一直到releases\1.6.2。可折叠组件本身没有什么特别之处,只是放置组件的容器。
a8jjtwal2#
我认为您可以使用JSplitPane来解决您的问题。利用该属性明智地设置分隔符的位置,您可以实现您想要的。
j1dl9f463#
所以这里有一个纯粹用Swing编写的小类:)这个实现假设标题在左上角...