Search code examples
javaswingjtextfieldlayout-managergridbaglayout

GridBagLayout format error. JTextFields in wrong positions


I simply cannot get my JTextFields to align correctly. Right now the program looks like this: .

Now the Assignment numbers are correctly aligned. However the Mark JTextfield starts under 7 and Weight JTextField starts under the last Mark.

Now what I want is for everything to correctly align. Meaning at Assignment 1 there are Mark and Weight JTextFields under the same row. This should go along all the way down to 7 ( or how many number of rows I choose).

Code:

    public class test{

    private static final Insets normalInsets = new Insets(10,10,0,10);
    private static final Insets finalInsets = new Insets(10,10,10,10);





    private static JPanel createMainPanel(){
        GridBagConstraints gbc = new GridBagConstraints();

        //Adding the JPanels. Panel for instructions
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());

        int gridy = 0;

        //JLabel for the Instructions
        JTextArea instructionTextArea = new JTextArea(5, 30);
        instructionTextArea.setEditable(false);
        instructionTextArea.setLineWrap(true);
        instructionTextArea.setWrapStyleWord(true);

        JScrollPane instructionScrollPane = new JScrollPane(instructionTextArea);
        addComponent(panel, instructionScrollPane, 0, gridy++, 3, 1, finalInsets, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL);

        //JLabels for Assignment
        JLabel label1 = new JLabel("Assignment");
        label1.setHorizontalAlignment(JLabel.CENTER);
        addComponent(panel, label1, 0, gridy, 1, 1, finalInsets,GridBagConstraints.CENTER,GridBagConstraints.HORIZONTAL);

        //JLabel for Mark
        JLabel label2 = new JLabel("Mark");
        label2.setHorizontalAlignment(JLabel.CENTER);
        addComponent(panel, label2, 1, gridy, 1, 1, finalInsets, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL);

        //JLabel for Weight.
        JLabel label3 = new JLabel("Weight");
        label3.setHorizontalAlignment(JLabel.CENTER);
        addComponent(panel, label3, 2, gridy++, 1, 1, finalInsets, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL);



        //JLabel Number for the number list of assignments at the side.
        for(int i = 1; i<=7; i++){
            String kok = String.valueOf(i);
        JLabel number = new JLabel(kok);
        number.setHorizontalAlignment(JLabel.CENTER);
        addComponent(panel, number, 0, gridy++, 1, 1, normalInsets, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL);
        }

        //JTextfield for Mark
        for(int i=0; i<7; i++){
        JTextField mark = new JTextField(20);
        mark.setHorizontalAlignment(JLabel.CENTER);
        addComponent(panel, mark, 1, gridy++, 1, 1, normalInsets, GridBagConstraints.CENTER,GridBagConstraints.NONE);
        }

        //JTextfield for Weight
        for(int i=0; i<7; i++){
        JTextField weight = new JTextField(20);
        weight.setHorizontalAlignment(JLabel.CENTER);
        addComponent(panel, weight, 2, gridy++, 1, 1, normalInsets, GridBagConstraints.CENTER,GridBagConstraints.NONE);
        }

        return panel;

    }

    private static void addComponent(Container container, Component component, int gridx, int gridy, int gridwidth, int gridheight, Insets insets, int anchor, int fill ){
        GridBagConstraints gbc = new GridBagConstraints(gridx, gridy, gridwidth, gridheight, 1.0D,1.0D,anchor,fill,insets,0,0);
        container.add(component,gbc);
    }

    public static void main(String[] args) {    
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createMainPanel());
        frame.pack();
        frame.setVisible(true);
        new test();
    }
}

I'm a terrible new Java programmer so go easy please :).

UPDATE~~~~~

 After running the `for` loops which add the `JLabels` and `JTextFields`, you will need to reset `gbc.gridy = 1`. This way the loop will start adding components from the top row.

//JLabel Number for the number list of assignments at the side.
for(int i = 1; i<=7; i++){
    String kok = String.valueOf(i);
    JLabel number = new JLabel(kok);
    number.setHorizontalAlignment(JLabel.CENTER);
    addComponent(panel, number, 0, gridy++, 1, 1, normalInsets, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL);
}
gbc.gridy = 1;

//JTextfield for Mark
for(int i=0; i<7; i++){
    JTextField mark = new JTextField(20);
    mark.setHorizontalAlignment(JLabel.CENTER);
    gridy = 1; //The code only partly works when I include this
    addComponent(panel, mark, 1, gridy++, 1, 1, normalInsets, GridBagConstraints.CENTER,GridBagConstraints.NONE);
}
gbc.gridy = 1;

And this is what it looks like:

Only the Weight JTextField properly aligned. When I don't add 'gridy=1' it has the same format error as my original screenshot.


Solution

  • After running the for loops which add the JLabels and JTextFields, you will need to reset gbc.gridy = 2. This way the loop will start adding components from the top row. Also, in each use of addComponent(), change gridy++ to gbc.gridy++.

    gbc.gridy = 2;
    
    //JLabel Number for the number list of assignments at the side.
    for(int i = 1; i<=7; i++){
        String kok = String.valueOf(i);
        JLabel number = new JLabel(kok);
        number.setHorizontalAlignment(JLabel.CENTER);
        addComponent(panel, number, 0, gbc.gridy++, 1, 1, normalInsets, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL);
    }
    gbc.gridy = 2;
    
    //JTextfield for Mark
    for(int i=0; i<7; i++){
        JTextField mark = new JTextField(20);
        addComponent(panel, mark, 1, gbc.gridy++, 1, 1, normalInsets, GridBagConstraints.CENTER,GridBagConstraints.NONE);
    }
    gbc.gridy = 2;
    
    //JTextfield for Weight
    for(int i=0; i<7; i++){
        JTextField weight = new JTextField(20);
        weight.setHorizontalAlignment(JLabel.CENTER);
        addComponent(panel, weight, 2, gbc.gridy++, 1, 1, normalInsets, GridBagConstraints.CENTER,GridBagConstraints.NONE);
    }
    

    This is what the result looks like: This is the result: