gpt4 book ai didi

Java Swing 不同高度组件的水平布局

转载 作者:行者123 更新时间:2023-12-01 18:42:51 28 4
gpt4 key购买 nike

我的 Java 8 Swing 程序基于简单的 DSL 动态构建 UI:

RADIO(AAAAAAAAAAAAAAAA;one;two;three) TEXT(B) TEXT(CCCCCC) RADIO(D;four;five;six;seven;eight;9;10)

应生成 JRadioButtonJTextField 的水平序列,如下所示:

 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);

以及RADIOTEXT字段是:

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)
);
}

但是看起来很糟糕是不可行的:

enter image description here

虽然我喜欢 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)
);
}

enter image description here

关于Java Swing 不同高度组件的水平布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887659/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com