Search code examples
javalayoutgridbaglayout

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


I am using GB layout for a form. Currently there are two rows, each consisting of 6 elements (the first row features labels, the second text fields). My problem is that element that should display in X 5 Y 1 displays in X 6 Y 0. Could you please point me to the mistake I am making?

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


}

Solution

  • Using GridBagLayout you need to call

    add(Component component, Object constraints)

    Adding your last component you forgot about GridBagConstraints object con.add(txtPresence);. Without it, component will be put after last component in first row, as it is first free space it will see being not constrained (it just makes Y=0 and goes for next available X). If you will be adding components in JPanel with GridBagLayout without GridBagConstraints object, they will be put in one row.

    Remember to set weights, fill and anchor with your GridBagConstraints object.

    You can also see my GridBagManager repo on github. It contains a demo showing how it works. You should still understand how GridBagLayout works though.

    SSCCE: (quickfix of your code)

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