What I want is the label and check box at the top left corner and the three buttons on the bottom right corner. However, it doesn't appear the the anchors are working properly.
Code:
JPanel bottomPanel = new JPanel( new GridBagLayout() );
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(0, 0, 0, 20);
c.anchor = GridBagConstraints.NORTHEAST;
bottomPanel.add(spinachLabel, c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 0;
c.anchor = GridBagConstraints.NORTHEAST;
bottomPanel.add(checkbox, c);
c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 5;
c.weightx = 0.5;
c.insets = new Insets(0, 0, 0, 5);
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(applyButton, c);
c = new GridBagConstraints();
c.gridx = 1;
c.gridy = 5;
c.weightx = 0.5;
c.insets = new Insets(0, 0, 0, 5);
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(refreshButton, c);
c = new GridBagConstraints();
c.gridx = 2;
c.gridy = 5;
c.weightx = 0.5;
c.anchor = GridBagConstraints.SOUTHWEST;
bottomPanel.add(cancelButton, c);
return bottomPanel;
First, we need to clarify what GridBagConstraints.anchor does: It specifies the placement of a component within the GridBagLayout cell.
spinachLabel is being placed at gridx = 0. applyButton is also being placed at gridx = 0. Therefore, they are guaranteed to be placed in cells which are in the same column. Their respective anchor constraints can move their position within their cells, but cannot move the cells themselves.
Second, you have not set any weighty
constraints. Whenever a container which uses a GridBagLayout is larger than the preferred sizes of its child components, it uses the GridBagLayout’s weight constraints to decide which cells will grow to take up that extra space. When there are no weight constraints at all, as is the case for the vertical dimension in your layout, GridBagLayout doesn’t give any of the cells that extra space, and instead centers them. That’s what you’re seeing: Since no cell has a weighty
set, all the cells are vertically centered.
In summary, your components will never appear at the top and bottom, unless you set some positive weighty
constraints.
This doesn’t seem like a good use of GridBagLayout. When you want to place components at the edges, BorderLayout is usually a better choice:
JCheckBox checkbox = new JCheckBox("Enable Spinach Study");
JButton applyButton = new JBUtton("Apply");
JButton refreshButton = new JBUtton("Refresh");
JButton cancelButton = new JBUtton("Cancel");
JComponent buttonPane = new JPanel(new FlowLayout(FlowLayout.TRAILING));
buttonPane.add(applyButton);
buttonPane.add(refreshButton);
buttonPane.add(cancelButton);
JPanel bottomPanel = new JPanel(new BorderLayout());
bottomPanel.add(checkbox, BorderLayout.PAGE_START);
bottomPanel.add(buttonPane, BorderLayout.PAGE_END);
(A JCheckBox should always have text, rather than being placed to the right of a label. That way, the user has a much larger mouse target, and your user interface is accessibility compatible.)