Java Gridbag 未对齐 - 第一行中显示的第二行中的最后一个单元格

Java Gridbag missalign - last cell in second row displayed in first row

我正在为表单使用 GB 布局。目前有两行,每行包含 6 个元素(第一行是标签,第二行是文本字段)。我的问题是应该显示在 X 5 Y 1 中的元素显示在 X 6 Y 0 中。你能指出我犯的错误吗?

public GUI() {
    super("Bla");
    GridBagLayout layout = new GridBagLayout();
    setLayout(layout);
    GridBagConstraints gbc = new GridBagConstraints();      
    [enter image description here][1]gbc.insets = new Insets(10,10,10,10);
    Container con = getContentPane();

    panel1 = new JPanel();

    labBrawn = new JLabel("Brawn");
    gbc.gridx = 0;
    gbc.gridy = 0;
    con.add(labBrawn, gbc); 

    labAgility = new JLabel("Agility");
    gbc.gridx = 1;
    gbc.gridy = 0;
    con.add(labAgility, gbc);

    labIntellect = new JLabel("Intellect");
    gbc.gridx = 2;
    gbc.gridy = 0;
    con.add(labIntellect, gbc);

    labCunning = new JLabel("Cunning");
    gbc.gridx = 3;
    gbc.gridy = 0;
    con.add(labCunning, gbc);

    labWillpower = new JLabel("Willpower");
    gbc.gridx = 4;
    gbc.gridy = 0;
    con.add(labWillpower, gbc);

    labPresence = new JLabel("Presence");
    gbc.gridx = 5;
    gbc.gridy = 0;
    con.add(labPresence, gbc);



    txtBrawn = new JTextField("", 2);
    gbc.gridx = 0;
    gbc.gridy = 1;
    con.add(txtBrawn, gbc);

    txtAgility = new JTextField("", 2);
    gbc.gridx = 1;
    gbc.gridy = 1;
    con.add(txtAgility, gbc);

    txtIntellect = new JTextField("", 2);
    gbc.gridx = 2;
    gbc.gridy = 1;
    con.add(txtIntellect, gbc);

    txtCunning = new JTextField("", 2);
    gbc.gridx = 3;
    gbc.gridy = 1;
    con.add(txtCunning, gbc);

    txtWillpower = new JTextField("", 2);
    gbc.gridx = 4;
    gbc.gridy = 1;
    con.add(txtWillpower, gbc);

    txtPresence = new JTextField("", 2);
    gbc.gridx = 5;
    gbc.gridy = 1;
    con.add(txtPresence);


}

使用 GridBagLayout 你需要调用

add(Component component, Object constraints)

添加最后一个组件时您忘记了 GridBagConstraints 对象 con.add(txtPresence);。没有它,组件将放在第一行的最后一个组件之后,因为它首先是免费的 space 它将看到不受约束(它只是使 Y=0 并用于下一个可用的 X)。如果您要在 JPanel 中添加组件 GridBagLayout 而没有 GridBagConstraints 对象,它们将被放在一行中。

记得用您的 GridBagConstraints 对象设置 weightsfillanchor

您还可以在 github 上查看我的 GridBagManager 存储库。它包含一个展示其工作原理的演示。不过,您应该仍然了解 GridBagLayout 的工作原理。

SSCCE:(快速修复您的代码)

public class GUI extends JFrame {

    public static void main(String[] args) {
        GUI gui = new GUI();
        gui.setSize(600, 600);
        gui.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        SwingUtilities.invokeLater(() -> {
            gui.setVisible(true);
        });
    }

    public GUI() {
        super();

        //those should be initialized outside
        JLabel labBrawn = new JLabel("Brawn");
        JLabel labAgility = new JLabel("Agility");
        JLabel labIntellect = new JLabel("Intellect");
        JLabel labCunning = new JLabel("Cunning");
        JLabel labWillpower = new JLabel("Willpower");
        JLabel labPresence = new JLabel("Presence");

        JTextField txtBrawn = new JTextField("", 2);
        JTextField txtAgility = new JTextField("", 2);
        JTextField txtIntellect = new JTextField("", 2);
        JTextField txtCunning = new JTextField("", 2);
        JTextField txtWillpower = new JTextField("", 2);
        JTextField txtPresence = new JTextField("", 2);
        //--------------------------------------------

        //here goes actual GUI
        GridBagLayout gridBagLayout = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(10, 10, 10, 10);
        gbc.anchor = GridBagConstraints.NORTH;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;

        JPanel dataInputPanel = new JPanel();
        dataInputPanel.setLayout(gridBagLayout);

        gbc.weightx = 1;
        gbc.weighty = 0;

        gbc.gridx = 0;
        gbc.gridy = 0;
        dataInputPanel.add(labBrawn, gbc);

        gbc.gridx = 1;
        gbc.gridy = 0;
        dataInputPanel.add(labAgility, gbc);

        gbc.gridx = 2;
        gbc.gridy = 0;
        dataInputPanel.add(labIntellect, gbc);

        gbc.gridx = 3;
        gbc.gridy = 0;
        dataInputPanel.add(labCunning, gbc);

        gbc.gridx = 4;
        gbc.gridy = 0;
        dataInputPanel.add(labWillpower, gbc);

        gbc.gridx = 5;
        gbc.gridy = 0;
        dataInputPanel.add(labPresence, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        dataInputPanel.add(txtBrawn, gbc);

        gbc.gridx = 1;
        gbc.gridy = 1;
        dataInputPanel.add(txtAgility, gbc);

        gbc.gridx = 2;
        gbc.gridy = 1;
        dataInputPanel.add(txtIntellect, gbc);

        gbc.gridx = 3;
        gbc.gridy = 1;
        dataInputPanel.add(txtCunning, gbc);

        gbc.gridx = 4;
        gbc.gridy = 1;
        dataInputPanel.add(txtWillpower, gbc);

        gbc.gridx = 5;
        gbc.gridy = 1;
        gbc.weighty = 1;
        dataInputPanel.add(txtPresence, gbc);

        dataInputPanel.setBackground(Color.red);
        this.add(dataInputPanel, BorderLayout.NORTH);
    }
}