Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UI:在调整大小时设置swing组件行为_Java_Swing_User Interface_Netbeans 8 - Fatal编程技术网

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

Java UI:在调整大小时设置swing组件行为,java,swing,user-interface,netbeans-8,Java,Swing,User Interface,Netbeans 8,我很难正确设置swing组件在调整大小时的行为方式 我对该接口有两个问题: 答:每行开头的切换按钮用于折叠/展开文本。所有元素都包含在JLayeredPane中。在单击按钮时,我编辑窗格的高度以展开或折叠内容(31或310)展开可以很好地工作,并推动下面的元素。另一方面,collapse确实隐藏了文本,但保留了所有元素的位置。这是我的密码: private void expandText(java.awt.event.ActionEvent evt) { JToggleButton b

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

我对该接口有两个问题:

答:每行开头的切换按钮用于折叠/展开文本。所有元素都包含在JLayeredPane中。在单击按钮时,我编辑窗格的高度以展开或折叠内容(31或310)<代码>展开可以很好地工作,并推动下面的元素。另一方面,
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();
}
上面的截图是窗口的最小尺寸。当我水平调整窗口大小时,内部窗格的大小仅调整为
min+(frame.width-min)/2
,这意味着我的右滚动条不会粘在框架的右侧

public final class TestFrame extends JFrame {

(...)

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

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

        }
    });

}
请参见以下两个问题的演示:

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

另一方面,折叠确实隐藏了文本,但保留了所有元素的位置

如果添加/删除组件,则基本代码为:

panel.remove(...);
panel.add(...);
panel.revalidate();
panel.repaint();
这意味着我的右滚动条不会粘在框架的右侧

public final class TestFrame extends JFrame {

(...)

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

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

        }
    });

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

所有元素都包含在JLayeredPane中


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

嗯,您可以向帧添加一个侦听器,以便在调整帧大小时对事件执行操作。然后把框架打包

public final class TestFrame extends JFrame {

(...)

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

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

        }
    });

}
如果您使用的是“绘制图形”方法,那么还应该重新绘制()框架

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

根据和注释,请参见我是如何解决它的:


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

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

JToggleButton
控制的展开/折叠功能通过隐藏下面的面板
来工作。setVisibility(false)
。不需要重新包装什么的,就这样。以下是在不更改按钮图标的情况下代码的外观:

private void inverseVisibility(JToggleButton expand, JPanel target) {
    if (expand.isSelected()) {
        target.setVisible(true);
    } else {
        target.setVisible(false);
    }
}
由于我只希望元素水平调整大小,因此我的所有面板都具有
水平
填充
值和
西北
锚定
。我已经设置了
weightX=1;权重Y=0
。最后,我在底部添加了一个嵌板,带有<代码>西南< /代码>锚点并填写<代码> < < /代码>以及两个权重> <代码> 1 >代码>(不确定它会改变什么,但这样我确信它会填满底部的所有空白空间,它的窗口尺寸比它的内容大)。
点B已经解决,方法是将适合我的
框架的背景面板放入
JScrollPane
。我的错误是由于Netbeans编辑器没有正确地将滚动窗格粘贴到框架的一侧,这是由于框架和滚动窗格中定义的大小不一致造成的。如果您使用此工具,我的建议是设置尽可能少的值,因为许多值都是由gui设计器高度互连的


(95864字节)

似乎有点极端和低效,因为这种方法经常被调用。我更喜欢删除和添加的camickr解决方案。关于A点:我已经编辑了我的帖子以包含代码。我添加了
inti=backgroundPane.getIndexOf(父级);背景窗格。删除(i);背景窗格。添加(父,i)在重新验证()之前。父级是我的JLayeredPane,我有6个,每行一个。它确实刷新了布局,但元素以一种我看不到模式的方式奇怪地移动。对那些感兴趣的人来说,这里的代码是:`父对象是我的JLayeredPane,我有6个,每行一个。`-对我来说没有意义。分层窗格用于显示相互重叠的组件(即Z轴)。组件是垂直显示的,因此应该使用布局管理器<代码>父项。设置大小(大小)-每当我看到这样的代码,就意味着您使用的是空布局。Swing设计用于布局管理器,因此组件将随着帧大小的变化自动调整大小/重新定位。ui是使用NetBeans构建的,这意味着到处都有
GroupLayout
。当我使用layeredpane.remove(scrollpane)
时,元素成功地调整了大小,如果我调整了窗口的大小也是一样。当我重新添加元素时,
JLayeredPane
保持其小尺寸,隐藏它包含的
JScrollPane
。我已经更新了我的代码:我不能帮助,因为我从来没有看过由IDE生成的布局代码。我也不看代码,除非它出现在本论坛的一个合适的
SSCCE
中,而不是在一个外部网站上。关于B点:设置我的
背景窗格的大小(包含在
JScrollPane
中,其大小现在也设置好了),我的框架解决了这个问题。