I'm trying to write what I thought should be an easy to specify dialog, I have a few labels and a few text areas opposite them and then an OK and cancel button. In the middle I have a wide component (I used a label for example)
|label| [combo box]
|label| [txtfield]
|label| [txtfield]
| long label here |
[btn1] [btn2]
I'm trying to use the GridBagLayout, it's not doing what I want, and I'm not sure I understand why. Basically I want the buttons to be anchored to the bottom of the dialog.
The code below shoes how I'm using it:
package gui;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
public class GridBagLayoutExample2 extends JFrame {
private static final long serialVersionUID = -1972347726217162551L;
final private JLabel lbl1 = new JLabel("LABEL1: ");
final private JLabel lbl2 = new JLabel("LABEL2: ");
final private JLabel lbl3 = new JLabel("LABEL3: ");
final private JTextArea txt1 = new JTextArea(" ");
final private JComboBox cmb1 = new JComboBox();
final private JTextArea txt2 = new JTextArea("");
final private JLabel lblLine = new JLabel("a compenent on all the line");
final private JButton btnOK = new JButton("OK");
final private JButton btnCancel = new JButton("Cancel");
public GridBagLayoutExample2() {
GridBagLayout bl = new GridBagLayout();
Container pane = getContentPane();
pane.setLayout(bl);
GridBagConstraints c = new GridBagConstraints();
int r = 0;
placeComponentInGridBagLayout(lbl1, pane, bl, c, 0, r, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, null, null, null, null);
placeComponentInGridBagLayout(cmb1, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
placeComponentInGridBagLayout(lbl2, pane, bl, c, 0, r, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, null, null, null, null);
placeComponentInGridBagLayout(txt2, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
placeComponentInGridBagLayout(lbl3, pane, bl, c, 0, r, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
placeComponentInGridBagLayout(txt1, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
placeComponentInGridBagLayout(lblLine, pane, bl, c, 0, r++, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 2, null, null, null);
placeComponentInGridBagLayout(btnOK, pane, bl, c, 0, null, null, null, GridBagConstraints.PAGE_END, GridBagConstraints.HORIZONTAL, null, null, null, null);
placeComponentInGridBagLayout(btnCancel, pane, bl, c, 1, null, null, null, GridBagConstraints.PAGE_END, GridBagConstraints.HORIZONTAL, null, null, null, null);
setSize(new Dimension(850, 350));
pack();
setVisible(true);
}
public static void placeComponentInGridBagLayout(Component component, Container container, GridBagLayout bagLayout, GridBagConstraints c, Integer gridX, Integer gridY, Double weightX, Double weightY, Integer anchor, Integer fill, Integer ipadx, Integer ipady,
Integer gridWidth, Integer gridHeight) {
if (c == null) {
c = new GridBagConstraints();
}
if (gridX != null) {
c.gridx = gridX;
}
if (gridY != null) {
c.gridy = gridY;
}
if (weightX != null) {
c.weightx = weightX;
}
if (weightY != null) {
c.weighty = weightY;
}
if (fill != null) {
c.fill = fill;
}
if (anchor != null) {
c.anchor = anchor;
}
if (ipadx != null) {
c.ipadx = ipadx;
}
if (ipady != null) {
c.ipady = ipady;
}
if (gridWidth != null) {
c.gridwidth = gridWidth;
}
if (gridHeight != null) {
c.gridheight = gridHeight;
}
bagLayout.setConstraints(component, c);
container.add(component);
}
}
Any idea what I'm doing wrong? Also is there a more modern way of achieving the same thing in Swing?
thanks
When doing a simple form, SpringLayout is a useful layout manager. And to pack components on a line, it's useful to use BoxLayout.
Here is a quick example:

And here is the code:
public class LayoutDemo extends JFrame {
public LayoutDemo() {
JLabel label1 = new JLabel("label 1");
JLabel label2 = new JLabel("label 2");
JLabel label3 = new JLabel("label 3");
JComboBox<String> combobox = new JComboBox<>();
JTextField field1 = new JTextField();
JTextField field2 = new JTextField();
JPanel formPanel = new JPanel(new SpringLayout());
formPanel.add(label1);
formPanel.add(combobox);
formPanel.add(label2);
formPanel.add(field1);
formPanel.add(label3);
formPanel.add(field2);
SpringUtilities.makeCompactGrid(formPanel, 3, 2, 2, 2, 3, 3);
JLabel longLabel = new JLabel("This is a longer label");
longLabel.setAlignmentX(CENTER_ALIGNMENT);
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
buttonPanel.add(button1);
buttonPanel.add(Box.createHorizontalGlue());
buttonPanel.add(button2);
JPanel basePanel = new JPanel();
basePanel.setLayout(new BoxLayout(basePanel, BoxLayout.PAGE_AXIS));
basePanel.add(formPanel);
basePanel.add(longLabel);
add(basePanel, BorderLayout.NORTH);
add(buttonPanel, BorderLayout.SOUTH);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new LayoutDemo();
}
}
You may want to use BorderLayout to e.g. keep the formPanel at the top without stretching when resizing the window. But I hop I gave you some ideas on how to use SpringLayout for forms.
One problem I can see is that your long label is going in the same grid cell as your OK button.
If you want the buttons anchored at the bottom of the entire dialog, try using a BorderLayout. Make a separate panel for the buttons and put that in BorderLayout.SOUTH. Then put your main stuff in another panel with the GridBagLayout, and put that in BorderLayout.CENTER. The buttons won't be perfectly aligned with your text components, but I think that's OK.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With