我希望有一个JPanel,当用户点击其边框上的文本/图标时,可以折叠或展开。由于我的应用程序空间不足,我需要这种类型的面板。
我了解到CollapsiblePanel类,但不确定如何使用它。我认为需要下载SwingX,但无法找到它。
此外,如果我能在基本的Java Swing中得到解决方案就更好了。
我不确定你在哪里找过了,但即使考虑到我们所处的基础设施混乱,也不是那么难找到。
前往SwingX项目主页,然后按照第一段中的链接转到(简版)下载部分,一直找到releases\1.6.2。折叠面板本身没有什么特别之处,只是用于放置组件的容器。
这里是一个纯粹使用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);
}
}
JTabbedPane
、JSplitPane
、CardLayout
、JDesktopPane
/JInternalFrame
,或者将额外的控件弹出到(可能是模态的)JDialog
或JOptionPane
中可能更合适。 - Andrew Thompson