Abajo tienes el código que crea el GridBagLayout y los componentes que maneja. Aquí tienes el programa completo. El programa puede ejecutarse dentro de un applet, con la ayuda de AppletButton, o como una aplicación.
protected void makebutton(String name, GridBagLayout gridbag, GridBagConstraints c) {
Button button = new Button(name);
gridbag.setConstraints(button, c);
add(button);
}
public GridBagWindow() {
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
setFont(new Font("Helvetica", Font.PLAIN, 14));
setLayout(gridbag);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
makebutton("Button1", gridbag, c);
makebutton("Button2", gridbag, c);
makebutton("Button3", gridbag, c);
c.gridwidth = GridBagConstraints.REMAINDER; //Final de fila
makebutton("Button4", gridbag, c);
c.weightx = 0.0; //resetea a los valores por defecto
makebutton("Button5", gridbag, c); //otra fila
c.gridwidth = GridBagConstraints.RELATIVE; /sigua al último de la fila
makebutton("Button6", gridbag, c);
c.gridwidth = GridBagConstraints.REMAINDER; //fin de fila
makebutton("Button7", gridbag, c);
c.gridwidth = 1; //resetea a los valores por defecto
c.gridheight = 2;
c.weighty = 1.0;
makebutton("Button8", gridbag, c);
c.weighty = 0.0; //resetea a los valores por defecto
c.gridwidth = GridBagConstraints.REMAINDER; //fin de fila
c.gridheight = 1; //resetea a los valores por defecto
makebutton("Button9", gridbag, c);
makebutton("Button10", gridbag, c);
}
Este ejemplo utiliza un sólo ejemplar de GridBagConstraints para todos los componetes manejados por el GridBagLayout. Justo antes de que cada componente sea añadido al contenedor, el código selecciona (o resetea a los valores por defecto) las variables apropiadas del objeto GridBagConstraints. Luego utiliza el método setConstraints() para grabar los valores obligatorios de ese componente.
Por ejemplo, justo antes de añadir un componente al final de una fila verá el siguiente código:
c.gridwidth = GridBagConstraints.REMAINDER; //final de fila
Y justo antes de añadir el siguiente componente (si el siguiente componente no ocupa una fila completa), verás la misma variable reseteada a su valor por defecto:
c.gridwidth = 1; //resetea al valor por defecto
Para mayor claridad aquí tienes una tabla que muestra todas las obligaciones para cada componente manejado por GridBagLayout. Los valores que no son por defecto están marcados en negrita. Los valores que son diferentes de su entrada anterior en la tabla están marcados en itálica.
Component Constraints
--------- -----------
All components gridx = GridBagConstraints.RELATIVE
gridy = GridBagConstraints.RELATIVE
fill = GridBagConstraints.BOTH
ipadx = 0, ipady = 0
insets = new Insets(0,0,0,0)
anchor = GridBagConstraints.CENTER
Button1, Button2, Button3 gridwidth = 1
gridheight = 1
weightx = 1.0
weighty = 0.0
Button4 gridwidth = GridBagConstraints.REMAINDER
gridheight = 1
weightx = 1.0
weighty = 0.0
Button5 gridwidth = GridBagConstraints.REMAINDER
gridheight = 1
weightx = 0.0
weighty = 0.0
Button6 gridwidth = GridBagConstraints.RELATIVE
gridheight = 1
weightx = 0.0
weighty = 0.0
Button7 gridwidth = GridBagConstraints.REMAINDER
gridheight = 1
weightx = 0.0
weighty = 0.0
Button8 gridwidth = 1
gridheight = 2
weightx = 0.0
weighty = 1.0
Button9, Button10 gridwidth = GridBagConstraints.REMAINDER
gridheight = 1
weightx = 0.0
weighty = 0.0
Todos los componentes de este contenedor son tan grandes como sea aposible, dependiendo de su fila y columna. El programa consigue esto selección la variable fill de GridBagConstraints a GridBagConstraints.BOTH, dejándola seleccionada para todos los componentes.
Este programa tiene cuatro componentes que se espanden varias columnas (Button5, Button6, Button9, and Button10) y uno que se espande varias filas (Button8). Sólo en uno de estos caso (Button8) se especifica explícitamente la anchura y altura del componente. En los otros casos, la anchura de los componentes está especificada como GridBagConstraints.RELATIVE o GridBagConstraints.REMAINDER, lo que le permite a GridBagLayout determinar el tamaño del componente, teniendo en cuentra el tamaño de los otros componentes de la fila.
Cuando se agrande la ventana del programa, observará que la anchura de las columnas crece los mismo que la ventana. Este es el resultado de cada componente de la primer fila (donde cada componente tiene la anchura de una columna) tiene weightx = 1.0. El valor real del weightx de estos componentes no tiene importancia. Lo que importa es que todos los componentes (y así todas las columnas) tienen el mismo peso que es mayor que cero. Si ningún componente manejado por el GridBagLayout tuviera seleccionado weightx, cuando se ampliara la anchura del contenedor, los componentes permanecerían juntos en el centro del contenedor.
Otra cosa que habrás observado es que cuando se aumenta la altura de la ventana la última línea es la única que se agranda. Esto es así porque el Button8 tiene weighty mayor que cero. Button8 se espande dos filas, y el GridBagLayout hace que el peso de este botón asigne todos el espacio a las dos últimas filas ocupadas por él.