Re: GridBagLayout not behaving as specified



Qu0ll wrote:
I have a problem with GridBagLayout that I would appreciate some help with in solving.

In the following simple example I am trying to have a user label and text field plus a password label and field evenly spaced across the panel with a database field below it and a button all the way over to the right taking up very little space. To do this I have set up a 2 x 16 grid but it's not behaving as I believe I am specifying it. The problem is that the button is taking up the same amount of space as the password field even though the password field has a grid width of 4 and the button only 1. The result is that the top line is not evenly spaced and too much room is allocated for the button.

Why is this? What's wrong with my GridBagLayout definition or usage?


First of all, you seem to think that the gridwidth is used to determine the size ratios of the components (eg. a component with gridwidth 2 must be double as wide as one with gridwidth 1).
This is not true. The width of a column is determined by the size of the components in that column.
However, if you have a component with a gridwidth of 2 (or more), gb layout makes sure that the total width of both columns is at least the size of the component. If one of those colums has no other components (that have their anchor in that column) this column is assigned a width of 0 and all of the width of the component is assigned to the other column. This is why the last column in your layout is as wide as the password field.

If there is space left in the container, the remaining space is distributed over the columns. The weights of the columns determines how much extra space is allocated to each column.

As far as I can see, the exact layout you want te achieve is not possible using gridbaglayout. The closest I could get is putting the dbButton next to the password field.

I've changed your code in this sense.

Hope this helps,
Axel Hallez



import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class GBTest extends JFrame {

private JPanel panel = new JPanel();
private JLabel userLabel = new JLabel("User:");
private JLabel passwordLabel = new JLabel("Password:");
private JLabel dbLabel = new JLabel("Database:");
private JTextField userTextField = new JTextField();
private JTextField dbTextField = new JTextField();
private JPasswordField passwordField = new JPasswordField();
private JButton dbButton = new JButton("...");

public GBTest() {
setLayout(new BorderLayout());
panel.setLayout(new GridBagLayout());

userLabel.setText("User:");
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.weightx = 0.0;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(0, 4, 18, 0);
gbc.ipadx = 0;
panel.add(userLabel, gbc);

gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.insets = new Insets(0, 4, 18, 4);
gbc.ipadx = 0;
panel.add(userTextField, gbc);

gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 0;
gbc.weightx = 0.0;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(0, 4, 18, 0);
gbc.ipadx = 0;
panel.add(passwordLabel, gbc);

gbc.gridx = 3;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1.0;
gbc.weighty = 0.0;
gbc.insets = new Insets(0, 4, 18, 8);
gbc.ipadx = 0;
panel.add(passwordField, gbc);

gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.weightx = 0.0;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(0, 4, 18, 0);
gbc.ipadx = 0;
panel.add(dbLabel, gbc);

gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridwidth = 3;
gbc.anchor = GridBagConstraints.WEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 0;
gbc.weighty = 0.0;
gbc.insets = new Insets(0, 4, 18, 0);
gbc.ipadx = 0;
panel.add(dbTextField, gbc);

gbc.gridx = 4;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.EAST;
gbc.weightx = 0.0;
gbc.weighty = 0.0;
gbc.insets = new Insets(0, 4, 18, 8);
gbc.ipadx = 0;
panel.add(dbButton, gbc);

add(panel, BorderLayout.CENTER);

pack();
setPreferredSize(new Dimension(400, 250));
setSize(new Dimension(400, 250));
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new GBTest().setVisible(true);
}
});
}
}
.


Quantcast