我很难正确设置我的挥杆组件在调整大小时的行为方式。
我的界面有两个问题:
答:每行开头的切换按钮用于折叠/展开文本。所有元素都包含在JLayeredPane中。在按钮上单击,我编辑窗格的高度以展开或折叠内容(31或310)。 Expand
可以很好地推动下面的元素。另一方面,collapse
会隐藏文本,但会将所有元素保留在原位。这是我的代码:
private void expandText(java.awt.event.ActionEvent evt) {
JToggleButton button = (JToggleButton) evt.getSource();
Container parent = button.getParent();
Dimension size = parent.getSize();
String icon;
if (button.isSelected()) {
size.height = 310;
icon = "/org/cytoscape/ocsana/resources/images/minus.png";
} else {
size.height = 31;
icon = "/org/cytoscape/ocsana/resources/images/plus.png";
}
parent.setSize(size);
try {
button.setIcon(new ImageIcon(ImageIO.read(getClass().getResource(icon)).getScaledInstance(-1, 15, Image.SCALE_SMOOTH)));
} catch (IOException ex) {
}
backgroundPane.revalidate();
backgroundPane.repaint();
}
B:上面的截图是窗口的最小尺寸。当我水平调整窗口大小时,内部窗格仅调整为min + (frame.width - min) / 2
的值,这意味着我的右滚动条不会粘到框架的右侧。
见下面两个问题的演示:
答案 0 :(得分:0)
您的展开/折叠代码如何运作?您是仅仅使组件可见/不可见,还是从面板中添加删除组件?
另一方面,折叠会隐藏文本,但会将所有元素留在原位。
如果添加/删除组件,则基本代码为:
panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();
意味着我的右滚动条不会粘在框架的右侧。
这取决于您使用的布局管理器。我猜最简单的就是使用GrigBagLayout。它允许你'#34;填充"可用的空间。阅读How to Use GridBagLayout上Swing教程中的部分,了解更多信息和示例。
所有元素都包含在JLayeredPane中。
不确定您使用分层窗格的原因。默认情况下,分层窗格不使用布局管理器。
答案 1 :(得分:0)
好吧,您可以向框架添加一个侦听器,以便在调整框架大小时对事件执行操作。然后打包()框架。
public final class TestFrame extends JFrame {
(...)
this.getRootPane().addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
this.pack();
this.revalidate();
}
});
}
你正在使用绘画图形方法,你也应该重绘()你的画面。
在该方法中,您还可以通过基于e.getWidth()
计算窗口的首选大小来设置窗口的首选大小。答案 2 :(得分:0)
根据camickr answer和评论,看看我是如何解决的:
A点是由于我在NetBeans中使用的免费布局。我没有成功修复我的代码所以我改变了我的元素的结构。它可能不是最优的,并没有正确使用所有摆动概念,但它按照我想要的方式工作。
我在后台使用JLayeredPane
使用了GridBagLayout
。此背景窗格包含一列高度为30和260的JPanel
,一列用于摘要行,另一列用于详细信息。
由JToggleButton
控制的展开/折叠功能通过隐藏下面的面板belowPanel.setVisibility(false)
来工作。不需要重新包装或任何东西,就是这样。以下是代码的外观,而无需更改按钮的图标:
private void inverseVisibility(JToggleButton expand, JPanel target) {
if (expand.isSelected()) {
target.setVisible(true);
} else {
target.setVisible(false);
}
}
由于我只希望元素水平调整大小,因此我的所有面板的Horizontal
值为Fill
,Northwest
为Anchor
。我设置了weightX = 1; weightY = 0
。最后,我在底部添加了一个带有Southwest
锚点的面板,并将both
和两个权重填充到1
(不确定它会改变什么,但这样我确定它会填满所有在底部的空白处,窗口的大小比其内容大。)
B点已经通过我的Frame
的背景面板解决,然后将其放入JScrollPane
。我遇到的错误是由于Netbeans编辑器没有将滚动窗格正确地粘贴到框架的侧面,因为框架和滚动窗格中定义的尺寸不一致。如果您使用此工具,我建议您尽可能设置最少的值,因为许多值由gui设计师严重互连。
Get the full code(95,864字节)