Uso de GridBagLayout (y II)

Este post pertenece a mi antiguo blog en wordpress, pero decidí pasarme a github:pages por las siguientes razones

Antes de leer esta entrada deberías leer Uso de GridBagLayout (I), si no lo has hecho ya.

Veamos algunos parámetros que nos permitirán configurar cómo se verán nuestros componentes con más flexibilidad que la conseguida con los parámetros vistos en el post anterior:

fill

Define la forma en la que el componente crecerá o no cuando se cambie el tamaño del panel al que pertenece. Los valores posibles están definidas como constantes en GridBagConstraints y son:

anchor

Este parámetro se utiliza cuando el componente es más pequeño que su área de dibujo - la celda o celdas donde yace el componente - e indica el lugar al que el componente quedará fijado cuando se modifique el tamaño del panel. Los valores están definidos como constantes en GridBadConstraints. Podemos ver los valores y el lugar donde el componente quedará fijado en la siguiente tabla:

FIRST_LINE_START PAGE_START FIRST_LINE_END
LINE_START CENTER LINE_END
LAST_LINE_START PAGE_END LAST_LINE_END

weightx y weighty

Estos parámetros especifican cómo distribuir el espacio entre las columnas - weightx -  y las filas - weighty -. Los valores que pueden tomar varían entre 0.0 y 1.0, siendo 1.0 el de más peso, lo que indicaría que ese componente ocuparía el mayor espacio posible. Si no se indica lo contrario, ambos parámetros toman el valor 0.0, lo que indica a GridBagLayout que el espacio extra al cambiar el tamaño al panel se dibujará entre el borde de las fila y columnas y el borde del contenedor, dejando un espacio libre entre ellos.

Ahora veamos el código que genera el panel con el gestor GridBagLayout:

package es.rchavarria.gridbaglayouthowto;

public class GridBagLayoutDemo extends javax.swing.JPanel {
  public GridBagLayoutDemo() {
    initComponents();
  }

 private void initComponents() {
   java.awt.GridBagConstraints gridBagConstraints;

   btn5 = new javax.swing.JButton();
   btn1 = new javax.swing.JButton();
   btn2 = new javax.swing.JButton();
   btn4 = new javax.swing.JButton();
   btn6 = new javax.swing.JButton();
   btn3 = new javax.swing.JButton();

   setLayout(new java.awt.GridBagLayout());

   btn1.setText("btn 01");
   add(btn1, new java.awt.GridBagConstraints());

   btn2.setText("btn 02");
   gridBagConstraints = new java.awt.GridBagConstraints();
   gridBagConstraints.gridwidth = 2;
   add(btn2, gridBagConstraints);

   btn3.setText("btn 03");
   gridBagConstraints = new java.awt.GridBagConstraints();
   gridBagConstraints.gridx = 0;
   gridBagConstraints.gridy = 1;
   add(btn3, gridBagConstraints);

   btn4.setText("btn 04");
   gridBagConstraints = new java.awt.GridBagConstraints();
   gridBagConstraints.gridx = 0;
   gridBagConstraints.gridy = 2;
   gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
   gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH;
   add(btn4, gridBagConstraints);

   btn5.setText("btn 05");
   gridBagConstraints = new java.awt.GridBagConstraints();
   gridBagConstraints.gridx = 2;
   gridBagConstraints.gridy = 3;
   gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
   add(btn5, gridBagConstraints);

   btn6.setText("large btn");
   gridBagConstraints = new java.awt.GridBagConstraints();
   gridBagConstraints.gridx = 1;
   gridBagConstraints.gridy = 1;
   gridBagConstraints.gridwidth = 2;
   gridBagConstraints.gridheight = 2;
   gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
   gridBagConstraints.weightx = 1.0;
   gridBagConstraints.weighty = 1.0;
   add(btn6, gridBagConstraints);
 }

 private javax.swing.JButton btn1;
 private javax.swing.JButton btn2;
 private javax.swing.JButton btn3;
 private javax.swing.JButton btn4;
 private javax.swing.JButton btn5;
 private javax.swing.JButton btn6;
}

Mediante las líneas del código del tipo: add(componente, gridBagConstraint); se especifican las restricciones para cada componente. Es posible utilizar el mismo objeto para especificar las restricciones pero es recomendable utilizar distintas instancias.

Para ver el resultado de este código, simplemente podemos probarlo mediante la siguiente clase:

package es.rchavarria.gridbaglayouthowto;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class RunDemo {
public static void main(String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      JFrame frm = new JFrame("GridBagLayout HowTo");
      frm.getContentPane().add(new GridBagLayoutDemo());
      frm.pack();
      frm.setVisible(true);
    }
  });
}
}