Java 在GroupLayout中填充多个列

Java 在GroupLayout中填充多个列,java,swing,layout-manager,grouplayout,Java,Swing,Layout Manager,Grouplayout,在下面的GroupLayout中,两列(红色和橙色)具有独立的垂直对齐,只是它们共享相同的总体高度和位置 在底部橙色项目下方不添加间隙的情况下,该项目将垂直拉伸,以匹配红色列的总体高度。这是不可接受的(这是一个JComboBox,看起来很可怕)。我找到的唯一解决方案是添加一个精确标注尺寸的固定高度间隙(到橙色项目的底部)。有没有办法动态解决这个问题(即不使用常量)?答案在于addComponent()方法。它还有三个额外的功能 参数,即组件的最小、首选和最大尺寸。 要使JComboBox不垂直

在下面的GroupLayout中,两列(红色和橙色)具有独立的垂直对齐,只是它们共享相同的总体高度和位置


在底部橙色项目下方不添加间隙的情况下,该项目将垂直拉伸,以匹配红色列的总体高度。这是不可接受的(这是一个JComboBox,看起来很可怕)。我找到的唯一解决方案是添加一个精确标注尺寸的固定高度间隙(到橙色项目的底部)。有没有办法动态解决这个问题(即不使用常量)?

答案在于
addComponent()
方法。它还有三个额外的功能 参数,即组件的最小、首选和最大尺寸。 要使
JComboBox
不垂直拉伸,必须将最大大小设置为
GroupLayout。垂直组中的首选大小

package com.zetcode;

import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.GroupLayout;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JPanel;

public class GroupLayoutMultipleColumns extends JFrame {

    public GroupLayoutMultipleColumns() {

        initUI();
    }

    private void initUI() {

        JPanel green1 = createPanel(new Color(60, 170, 70));
        JPanel green2 = createPanel(new Color(60, 170, 70));
        JPanel red1 = createPanel(new Color(230, 0, 50));
        JPanel red2 = createPanel(new Color(230, 0, 50));
        JPanel red3 = createPanel(new Color(230, 0, 50));
        JPanel red4 = createPanel(new Color(230, 0, 50));

        JComboBox combo1 = new JComboBox();
        JComboBox combo2 = new JComboBox();

        createLayout(green1, red1, red2, red3, red4,
                combo1, combo2, green2);

        setTitle("Multiple columns");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public JPanel createPanel(Color col) {

        JPanel panel = new JPanel();
        panel.setBackground(col);
        return panel;
    }

    private void createLayout(JComponent... arg) {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);
        gl.setAutoCreateGaps(true);

        gl.setHorizontalGroup(gl.createParallelGroup()
                .addComponent(arg[0])
                .addGroup(gl.createSequentialGroup()
                        .addGroup(gl.createParallelGroup()
                                .addComponent(arg[1])
                                .addComponent(arg[2])
                                .addComponent(arg[3])
                                .addComponent(arg[4]))
                        .addGroup(gl.createParallelGroup()
                                .addComponent(arg[5])
                                .addComponent(arg[6])))
                .addComponent(arg[7])
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
                .addGroup(gl.createSequentialGroup()
                        .addGroup(gl.createParallelGroup()
                                .addGroup(gl.createSequentialGroup()
                                        .addComponent(arg[1])
                                        .addComponent(arg[2])
                                        .addComponent(arg[3])
                                        .addComponent(arg[4]))
                                .addGroup(gl.createSequentialGroup()
                                        .addComponent(arg[5], GroupLayout.DEFAULT_SIZE,
                                                GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                        .addComponent(arg[6], GroupLayout.DEFAULT_SIZE,
                                                GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))))
                .addComponent(arg[7])
        );

        pack();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            GroupLayoutMultipleColumns ex = new GroupLayoutMultipleColumns();
            ex.setVisible(true);
        });
    }
}
以下是截图:


GroupLayout是一个为诸如Matisse等GUI构建者开发的布局管理器,它也被SpringLayout所取代。考虑为此使用GUI生成器,并考虑升级到SpReSpRead。(顺便说一句,我们可以使用你的代码。)@markspace:a的观点很好<代码>组布局
自1.6起<代码>SpringLayout
从1.4开始。