Search code examples
javaswinggridbaglayout

Java GridBagLayout : make component align to left


I have this layout using GridBagLayout:

public class Example extends JFrame {
    public Example() {
        Border outline = BorderFactory.createLineBorder(Color.black);
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel pane = new JPanel(gbl);

        gbc.weighty = 1.0;
        gbc.weightx = 1.0;

        JLabel unitLbl = new JLabel("Unit");
        unitLbl.setBorder(outline);
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.ipadx = 30;
        gbc.ipady = 10;
        gbl.setConstraints(unitLbl, gbc);
        pane.add(unitLbl);

        JLabel typeLbl = new JLabel("Type");
        typeLbl.setBorder(outline);
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.ipadx = 30;
        gbc.ipady = 10;
        gbl.setConstraints(typeLbl, gbc);
        pane.add(typeLbl);

        JTextField unitField = new JTextField();
        typeLbl.setBorder(outline);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.ipadx = 30;
        gbc.ipady = 10;
        gbl.setConstraints(unitField, gbc);
        pane.add(unitField);

        String[] type = {"All", "Verb", "Noun", "Adjective"};
        JComboBox<String> comboBox = new JComboBox<String>(type);
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.ipadx = 30;
        gbc.ipady = 10;
        gbl.setConstraints(comboBox, gbc);
        pane.add(comboBox);


        add(pane, BorderLayout.CENTER);
        setSize(new Dimension(400, 300));
        getContentPane().setBackground(Color.WHITE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }
}

In this example, when run, It seems that every component is at the center of the frame. But what I want is :

  1. Two JLabel (unitLbl and typelbl) will be on the left of frame
  2. JTextField and JComboBox will be on the right of two JLabel, respectively with a small distance between.
  3. Moreover, I want to add a new JButton at location (3,0) of the grid, but the height of this location sum of two JLabel height. It means, this button height is on "two line".

How can I fix this code to achieve this goal ? Please help me.

Thanks :)


Solution

  • You want to use GridBagConsraints#anchor to define the position within the cell that you want to align the component to.

    To allow a component to span over number of cells, you want to use GridBagConstraints#gridwidth and GridBagConstraints#gridheight (the default is 1)

    enter image description here

    public class TestLayout09 {
    
        public static void main(String[] args) {
            new TestLayout09();
        }
    
        public TestLayout09() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException ex) {
                    } catch (InstantiationException ex) {
                    } catch (IllegalAccessException ex) {
                    } catch (UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new LayoutPane());
                    frame.setBackground(Color.WHITE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
    
            });
        }
    
        public class LayoutPane extends JPanel {
    
            public LayoutPane() {
                Border outline = BorderFactory.createLineBorder(Color.black);
                setLayout(new GridBagLayout());
                GridBagConstraints gbc = new GridBagConstraints();
    
                // I'm not sure this really is what you want, but I may be mistaken
    //            gbc.weighty = 1.0;
    //            gbc.weightx = 1.0;
    
                JLabel unitLbl = new JLabel("Unit");
                unitLbl.setBorder(outline);
                gbc.gridx = 0;
                gbc.gridy = 0;
                gbc.ipadx = 30;
                gbc.ipady = 10;
                gbc.anchor = GridBagConstraints.WEST;
                add(unitLbl, gbc);
    
                JLabel typeLbl = new JLabel("Type");
                typeLbl.setBorder(outline);
                gbc.gridx = 0;
                gbc.gridy = 1;
                gbc.ipadx = 30;
                gbc.ipady = 10;
                add(typeLbl, gbc);
    
                JTextField unitField = new JTextField();
                typeLbl.setBorder(outline);
                gbc.gridx = 1;
                gbc.gridy = 0;
                gbc.ipadx = 30;
                gbc.ipady = 10;
                gbc.anchor = GridBagConstraints.EAST;
                add(unitField, gbc);
    
                String[] type = {"All", "Verb", "Noun", "Adjective"};
                JComboBox<String> comboBox = new JComboBox<String>(type);
                gbc.gridx = 1;
                gbc.gridy = 1;
                gbc.ipadx = 30;
                gbc.ipady = 10;
                add(comboBox, gbc);
    
                JButton btn = new JButton("Test");
                gbc.gridx = 3;
                gbc.gridy = 0;
                gbc.fill = GridBagConstraints.BOTH;
                gbc.gridheight = 2;
                add(btn, gbc);
            }
        }
    }