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

标签 java swing

我的 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/

相关文章:

java - 线程在 notifyall() 之后没有返回

Java 一段代码在循环中停止而不是在 Eclipse 中停止整个程序

java - 盒子布局问题

Java Swing : List Models and Collections

java - 这是什么 Swing 组件?

JAVA 6x6 网格填色游戏

java - 如何从 X.509 证书生成 Java keystore

java - DICOM HTML5 与 JAVA 查看器

java - 在中使用 Autowiring 对象

java - Lucene 搜索失败,出现异常 : ava. lang.IllegalStateException:字段的意外文档值类型为 NONE