我的 Java 8 Swing 程序基于简单的 DSL 动态构建 UI:
RADIO(AAAAAAAAAAAAAAAA;one;two;three) TEXT(B) TEXT(CCCCCC) RADIO(D;four;five;six;seven;eight;9;10)
应生成 JRadioButton
和 JTextField
的水平序列,如下所示:
AAAAAAAAAAAAAAAA B CCCCCC D
(*) one [-----------] [-----------] (*) four
( ) two ( ) five
( ) three ( ) six
( ) seven
( ) eight
( ) 9
( ) 10
其中文本字段的宽度和高度相同,单选字段根据值而变化。字段类型和顺序完全取决于 DSL。
我最初的GroupLayout
实现很简单:
Group horizontalGroup = layout.createSequentialGroup();
fields.forEach(field -> horizontalGroup.addComponent(field));
layout.setHorizontalGroup(horizontalGroup);
Group verticalGroup = layout.createParallelGroup();
fields.forEach(field -> verticalGroup.addComponent(field));
layout.setVerticalGroup(verticalGroup);
以及RADIO
和TEXT
字段是:
private void radioField(JLabel label, List<JRadioButton> radioButtons) {
GroupLayout gl = new GroupLayout(this);
setLayout(gl);
gl.setAutoCreateContainerGaps(true);
Group horizontalGroup = gl.createParallelGroup();
horizontalGroup.addComponent(label);
radioButtons.forEach(radioValue -> horizontalGroup.addComponent(radioValue));
gl.setHorizontalGroup(horizontalGroup);
SequentialGroup verticalGroup = gl.createSequentialGroup();
verticalGroup.addComponent(label).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED);
radioButtons.forEach(radioValue -> verticalGroup.addComponent(radioValue));
gl.setVerticalGroup(verticalGroup);
}
private void textField(JLabel label, JTextField field) {
GroupLayout gl = new GroupLayout(this);
setLayout(gl);
gl.setAutoCreateContainerGaps(true);
gl.setHorizontalGroup(gl.createParallelGroup()
.addComponent(label)
.addComponent(field)
);
gl.setVerticalGroup(gl.createSequentialGroup()
.addComponent(label)
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(field)
);
}
但是看起来很糟糕是不可行的:
虽然我喜欢 GroupLayout
的简单性,但我开始怀疑是否需要其他布局。我愿意尝试其他的,尤其是 MigLayout
,但如果 GroupLayout
能做到,那就更好了。有什么想法吗?
最佳答案
通过添加两行代码,GridLayout
实现现在可以通过链接所有组件的大小来实现:
Group horizontalGroup = layout.createSequentialGroup();
fields.forEach(field -> horizontalGroup.addComponent(field));
layout.setHorizontalGroup(horizontalGroup);
Group verticalGroup = layout.createParallelGroup();
fields.forEach(field -> verticalGroup.addComponent(field));
layout.setVerticalGroup(verticalGroup);
layout.linkSize(fields.toArray(new Component[0])); // <-- ADDITION
并设置文本字段的最大高度:
private void textField(JLabel label, JTextField field) {
GroupLayout gl = new GroupLayout(this);
setLayout(gl);
field.setMaximumSize(new Dimension(Short.MAX_VALUE, 20)); // <-- ADDITION
gl.setAutoCreateContainerGaps(true);
gl.setHorizontalGroup(gl.createParallelGroup()
.addComponent(label)
.addComponent(field)
);
gl.setVerticalGroup(gl.createSequentialGroup()
.addComponent(label)
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(field)
);
}
关于Java Swing 不同高度组件的水平布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887659/