0

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

该界面有两个问题: 预期的

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

请参阅下面的两个问题的演示: 结果

4

3 回答 3

0

好吧,您可以向框架添加一个侦听器,以便在调整框架大小时对事件执行操作。然后 pack() 框架。

public final class TestFrame extends JFrame {

(...)

    this.getRootPane().addComponentListener(new ComponentAdapter() {
        public void componentResized(ComponentEvent e) {

             this.pack();
             this.revalidate();

        }
    });

}

如果您使用的是绘制图形方法,您还应该重新绘制()您的框架。

在该方法中,您还可以通过基于 e.getWidth() 计算来设置窗口的首选大小

于 2014-04-23T16:55:41.373 回答
0

您的展开/折叠代码如何工作?您只是使组件可见/不可见,还是从面板中添加删除组件?

另一方面,折叠确实隐藏了文本,但将所有元素保留在原位。

如果您添加/删除组件,那么基本代码是:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();

这意味着我的右滚动条不会粘在框架的右侧。

这取决于您使用的布局管理器。我猜最简单的方法是使用 GrigBagLayout。它允许您“填充”可用空间。阅读 Swing 教程中有关如何使用 GridBagLayout的部分以获取更多信息和示例。

所有元素都包含在 JLayeredPane 中。

不知道为什么要使用分层窗格。默认情况下,分层窗格不使用布局管理器。

于 2014-04-23T16:49:01.897 回答
0

根据camickr 的回答和评论,看看我是如何解决的:


A 点是由于我在 NetBeans 中使用的自由布局。我没有成功修复我的代码,所以我改变了元素的结构。它可能不是最优的,并且没有正确使用所有挥杆概念,但它可以按照我想要的方式工作。

JLayeredPane在后台有一个使用GridBagLayout. 此背景窗格包含一列,JPanel高度为 30 和 260,一列用于摘要行,另一列用于详细信息

在此处输入图像描述

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

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

由于我只希望元素水平调整大小,因此我所有的面板都具有HorizontalasFillNorthwestAnchor. 我已经设置了weightX = 1; weightY = 0. 最后,我在底部添加了一个带有Southwest锚点的面板,both并与两个权重一起填充1(不确定它会改变什么,但这样我确信它将填充底部的所有空白空间,窗口的大小会调整为更大的尺寸比它的内容)。


B 点已通过采用适合我的背景面板Frame并将其放入JScrollPane. 我遇到的错误是由于 Netbeans 编辑器没有正确地将滚动窗格粘贴到框架的一侧,因为框架和滚动窗格中定义的大小不一致。如果您使用此工具,我对您的建议是设置尽可能少的值,因为许多值与 gui 设计器密切相关。

获取完整代码(95,864 字节)

于 2014-04-25T19:01:26.110 回答