Java Swing:对齐[动态][静态][动态]组件宽度的最简单方法?

Java Swing:对齐[动态][静态][动态]组件宽度的最简单方法?,java,swing,layout,layout-manager,Java,Swing,Layout,Layout Manager,在标准Java Swing中,以以下方式对齐三个组件的最简单方法是什么: 组件1和组件3的动态宽度调整为相等 而组件2(介于两者之间)具有恒定的宽度 假设我们有一些可调整大小的JPanel(比如在JFrame中) 小宽度应如下所示: [----------------whole JPanel----------------] [--Component1--] [Component2] [--Component3--] [------------------------whole JPane

在标准Java Swing中,以以下方式对齐三个组件的最简单方法是什么:

  • 组件1
    组件3
    动态宽度调整为相等

  • 组件2
    (介于两者之间)具有恒定的宽度

假设我们有一些可调整大小的JPanel(比如在JFrame中)

小宽度应如下所示:

[----------------whole JPanel----------------]
[--Component1--] [Component2] [--Component3--]
[------------------------whole JPanel------------------------]
[------Component1------] [Component2] [------Component3------]
大宽度应如下所示:

[----------------whole JPanel----------------]
[--Component1--] [Component2] [--Component3--]
[------------------------whole JPanel------------------------]
[------Component1------] [Component2] [------Component3------]
注意:我用
GroupLayout
进行了太长时间的“测试并出错”。

一个选项是使用。让您快速入门的一个简单片段:

GridBagConstraints gbc;
final int A_CENTER = GridBagConstraints.CENTER;  // anchor: center
final int F_NONE = GridBagConstraints.NONE;  // fill: none
final int F_DX = GridBagConstraints.HORIZONTAL;  // fill: dx only
final Insets IN_0 = new Insets(0, 0, 0, 0);  // empty insets

setLayout(new GridBagLayout() );
gbc = new GridBagConstraints(0, 0, 1, 1, 50.0, 0.0, A_CENTER, F_DX, IN_0, 0, 0);
add(new JButton("test1"), gbc);
gbc = new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, A_CENTER, F_NONE, IN_0, 0, 0);
add(new JButton("test2"), gbc);
gbc = new GridBagConstraints(2, 0, 1, 1, 50.0, 0.0, A_CENTER, F_DX, IN_0, 0, 0);
add(new JButton("test1"), gbc);
很明显,你可以用一个GridBag做更多的事情,你需要做一些抛光来得到你想要看到的东西,但这应该让你开始

GBC构造函数中的第五个参数是x方向拉伸的权重。将它们设置为相等,并强制中心组件不拉伸(F_NONE)会带来麻烦。

管理器如何?它不是JRE的一部分,但是是一个很好的布局管理器,它可以用比GridBag更少的代码轻松地生成所需的布局。看看他们的网站


忍不住把漫画贴出来。。。享受(:

你可以重复使用GridBagConstraints:p我会让左锚向西,右锚向东,中间一个居中。使用GridBags的方法有很多:)我刚刚剪切并粘贴了一些我最近使用过的东西。就重用GBC而言。。。我觉得这会降低代码的可读性。很难看出您是否忘记设置一个约束条件。