## Cómo usar GridBagLayout: El ejemplo explicado

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

Esta es una imagen del GUI del applet, para ejecutarlo, pulsa sobre ella y el applet aparecerá en una nueva ventana del navegador.

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.

    JButton button;
    Container contentPane = getContentPane();
    GridBagLayout gridbag = new GridBagLayout();
    GridBagConstraints c = new GridBagConstraints();
    contentPane.setLayout(gridbag);
    c.fill = GridBagConstraints.HORIZONTAL;

    button = new JButton("Button 1");
    c.weightx = 0.5;
    c.gridx = 0;
    c.gridy = 0;
    gridbag.setConstraints(button, c);
    contentPane.add(button);

    button = new JButton("2");
    c.gridx = 1;
    c.gridy = 0;
    gridbag.setConstraints(button, c);
    contentPane.add(button);

    button = new JButton("Button 3");
    c.gridx = 2;
    c.gridy = 0;
    gridbag.setConstraints(button, c);
    contentPane.add(new JButton("Button 3"));

    button = new JButton("Long-Named Button 4");
    c.ipady = 40;      //make this component tall
    c.weightx = 0.0;
    c.gridwidth = 3;
    c.gridx = 0;
    c.gridy = 1;
    gridbag.setConstraints(button, c);
    contentPane.add(button);

    button = new JButton("Button 5");
    c.ipady = 0;       //reset to default
    c.weighty = 1.0;   //request any extra vertical space
    c.anchor = GridBagConstraints.SOUTH; //bottom of space
    c.insets = new Insets(10,0,0,0);  //top padding
    c.gridx = 1;       //aligned with button 2
    c.gridwidth = 2;   //2 columns wide
    c.gridy = 2;       //third row
    gridbag.setConstraints(button, c);
    contentPane.add(button);

Este ejemplo utiliza un 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, para hacer que el botón 4 sea extra alto, el ejemplo tiene este código:

    c.ipady = 40;

Y antes de seleccionar las restricciones para el siguiente componente, el códio reseta el valor de ipady al vaor por defecto

    c.ipady = 0;

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.

Componente | Restricciones
--- | ---
Todos los componentes |
    ipadx = 0
    fill = GridBagConstraints.HORIZONTAL
Button 1 |
    ipady = 0
    weightx = 0.5
    weighty = 0.0
    gridwidth = 1
    anchor = GridBagConstraints.CENTER
    insets = new Insets(0,0,0,0)
    gridx = 0
    gridy = 0
Button 2 |
    weightx = 0.5
    gridx = 1
    gridy = 0
Button 3 |
    weightx = 0.5
    gridx = 2
    gridy = 0
Button 4 |
    ipady = 40
    weightx = 0.0
    gridwidth = 3
    gridx = 0
    gridy = 1
Button 5 |
    ipady = 0
    weightx = 0.0
    weighty = 1.0
    anchor = GridBagConstraints.SOUTH
    insets = new Insets(10,0,0,0)
    gridwidth = 2
    gridx = 1
    gridy = 2

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.HORIZONTAL, dejándola seleccionada para todos los componentes. Si el programa no seleccionar el relleno, los botones serían de su anchura natural, de esta forma:

Este programa tiene cuatro componentes que se espanden varias columnas (buttons 4 y 5). Para hacer más alto el botón 4, le añadimos un borde interno (ipady). Para poner espacio entre los botones 4 y 5, usamos insets para añadir un mínimo de 10 pixels sobre el botón 5 y para que el botón 5 se situe en la parte inferior de su celda.

Cuando se agranda la ventana del programa, 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 de sta forma:

Observamos que alargamos la ventana, la última fila es la que se hace más alta. Es es así porque sólo el botón 5 tiene weighty mayor que cero.

Ozito