我正在尝试实现一个简单的 JDialog,其中上部 JPanel 有一个 GridBagLayout,它由 5 对 JLabel 组成:每对中,第一个 JLabel 充当 header ,而第二个 JLabel 包含从 Web 服务调用接收的数据。这是一个例子:
正如您所看到的,这个窗口太“空”,空间太多。 首先,我不明白为什么上面的面板比第二个面板大得多。事实上,标题为“Risultato”的 JPanel 也有 GridBagLayout,第一个面板位于第 0 列第 0 行,第二个面板位于第 0 列第 1 行。
然后,对于每个 JLabel,我调用以下方法: setMinimumSize(新尺寸(231, 25)) setPreferredSize(新尺寸(231, 25)) setMaximumSize(新尺寸(231, 25))
此外,我为与每个 JLabel 关联的每个 GridBagConstraints 设置了 anchor ,如下所示:
GridBagConstraints.FIRST_LINE_START
为红色;GridBagConstraints.CENTER
表示绿色;GridBagConstraints.LINE_START
表示橙色;GridBagConstraints.LINE_END
表示黄色;GridBagConstraints.LAST_LINE_START
表示蓝色;GridBagConstraints.LAST_LINE_END
为白色;
最后,我还为每个约束调用 setWeightX(1.0);
。
我不知道为什么会是这样的效果,也不知道为什么所有的JLabels前后都有那么多的空白空间。
有办法解决吗?那么上面的面板会适应它的所有组件吗?
我无法编写任何 Java 代码,因为我的开发团队被迫使用奇怪的内部框架,我们通过编写 xml 文件来构建布局,其中每个标签都是具有正确嵌套程度的容器或组件,然后通过 Reflection API,真正的Java 类和方法被实例化和调用。不管怎样,机制应该是一样的。
更新
非常感谢 Kevin Anderson,我能够改进 JDialog 布局
相当。此外,我在上部面板容器上为 GridBagConstraints
调用了 setWeightY(0.0)
,这样它也不会变得太大,并且可以根据其包含的组件调整大小。
最佳答案
您的标签位于两列中,并且它们都具有相同的weightX,因此GridBagLayout 为两列分配大约相等的宽度。但是,如果您为第二列中的标签赋予更大的weightX,例如10.0,则使第二列比第一列占用更多的空间。您将在列之间获得更少的空间,而在面板的最右侧获得更多的空间。
关于Java Swing : cannot spread components in whole JPanel with GridBagLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48206253/