Categorias: Programación
En el ejemplo anterior vimos una introducción al uso de las propiedades de posicionamiento y de padding interno. Ahora vamos a hablar de dos propiedades que son las que mas problemas traen.
Vamos a crear una ventana con dos botones sin padding; solo vamos a utilizar la propiedad de posicionamiento.
JPanel mainPanel = (JPanel) getContentPane();
mainPanel.setLayout(new GridBagLayout());
mainPanel.setBorder(BorderFactory.createTitledBorder("Content pane"));
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0; // columna
c.gridy = 0; // fila
JButton boton1 = new JButton("Boton 1");
mainPanel.add(boton1, c);
c.gridx = 1; // columna
c.gridy = 0; // fila
JButton boton2 = new JButton("Boton 2");
mainPanel.add(boton2, c);
La ventana con los dos botones quedaría asi:

Ahora si estiramos la ventana, vemos que los dos botones permanecen juntos; no se estiran para ocupar el espacio incrementado.

Si lo que queremos es que al estirarse la ventana, las celdas con sus componentes aprovechen el espacio incrementado, tenemos que utilizar las propiedades weightx y weighty.
Estos dos constraints especifican como el espacio restante del container ( en este caso la ventana ) debe distribuirse entre las celdas. weightx espeficica como distribuir el espacio restante horizontalmente, en cambio weighty como distribuirlo de forma vertical. Los valores que pueden tomar weightx y weighty están comprendidos entre 0.0 y 1.0. Estos valores representan el porcentaje de espacio restante que se le asignará a cada celda.
Supongamos que queremos que el "Boton1" ocupe todo el espacio restante. El "Boton2" solo ocupará el espacio comprendido por su tamaño, en tanto todo el espacio restante por haber estirado la ventana, será utilizado por la celda del "Boton1", 50% a la izquierda y el otro 50% a la derecha. Para que tenga dicho comportamiento, al constraint del "Boton1" le asignamos c.weightx = 1, en tanto al "Botón2" c.weighty = 0. Veamos el ejemplo:
JPanel mainPanel = (JPanel) getContentPane();
mainPanel.setLayout(new GridBagLayout());
mainPanel.setBorder(BorderFactory.createTitledBorder("Content pane"));
GridBagConstraints c = new GridBagConstraints();
c.weightx = 1; // 100% del espacio restante
c.gridx = 0; // columna
c.gridy = 0; // fila
JButton boton1 = new JButton("Boton 1");
mainPanel.add(boton1, c);
c.weightx = 0; // no le asignamos espacio extra
c.gridx = 1; // columna
c.gridy = 0; // fila
JButton boton2 = new JButton("Boton 2");
mainPanel.add(boton2, c);
Si nos fijamos el "Boton2" queda alejado del "Boton1" que a provecha todo el espacio incrementado.

Ahora vamos a asignarle los valores c.weightx = 1 al "Boton1" y al "Boton2". Vemos que los dos botones se reparten por igual el espacio restante del container (JFrame).

Veamos que pasa si al primer botón le asignamos el 30% (weightx= 0.3) del espacio restante y al segundo botón el restante (weightx=1 o weightx=0.7).

El "Boton1" ocupa el 30% del espacio, por eso si bien se aleja del "Boton2", vemos que queda un espacio entre el container y el botón. El "Boton2" aprovecha el espacio que queda, osea el 70%, 35% para la izquierda y 35 a la derecha.
La propiedad weighty funciona exactamente de la misma manera, solo que antes de aprovechar el espacio horizontal, toma el espacio vertical.
Puede visitar la página de Sun sobre GridBagLayout o Java Swing 2nd Edition donde encontrará código de ejemplo.