Java UI:在调整大小时设置swing组件行为

时间:2014-04-23 16:33:12

标签: java swing user-interface netbeans-8

我很难正确设置我的挥杆组件在调整大小时的行为方式。

我的界面有两个问题: expected

答:每行开头的切换按钮用于折叠/展开文本。所有元素都包含在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的值,这意味着我的右滚动条不会粘到框架的右侧。

见下面两个问题的演示: result

3 个答案:

答案 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,一列用于摘要行,另一列用于详细信息

enter image description here

JToggleButton控制的展开/折叠功能通过隐藏下面的面板belowPanel.setVisibility(false)来工作。不需要重新包装或任何东西,就是这样。以下是代码的外观,而无需更改按钮的图标:

private void inverseVisibility(JToggleButton expand, JPanel target) {
    if (expand.isSelected()) {
        target.setVisible(true);
    } else {
        target.setVisible(false);
    }
}

由于我只希望元素水平调整大小,因此我的所有面板的Horizontal值为FillNorthwestAnchor。我设置了weightX = 1; weightY = 0。最后,我在底部添加了一个带有Southwest锚点的面板,并将both和两个权重填充到1(不确定它会改变什么,但这样我确定它会填满所有在底部的空白处,窗口的大小比其内容大。)


B点已经通过我的Frame的背景面板解决,然后将其放入JScrollPane。我遇到的错误是由于Netbeans编辑器没有将滚动窗格正确地粘贴到框架的侧面,因为框架和滚动窗格中定义的尺寸不一致。如果您使用此工具,我建议您尽可能设置最少的值,因为许多值由gui设计师严重互连。

Get the full code(95,864字节)