## Cómo Utilizar GridBagLayout: El Applet de ejemplo Explicado

De nuevo, aquí está el applet que muestra un GridBagLayout en acción.

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.

Ozito