Uso de GridBagLayout (y II)

Puede ver una versión activa de este post en mi nuevo blog. He decidido dejar de publicar en este blog por éstas razones. Su filosofía es la misma que éste, pero espero no tener los problemas que me he encontrado aquí.

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:

  • NONE: valor por defecto. Indica que el componente no cambiará su tamaño.
  • HORIZONTAL: hará crecer el componente hasta completar el tamaño horizontal de la celda o celdas donde se encuentra el componente.
  • VERTICAL: igual que HORIZONTAL pero en sentido vertical.
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 filas 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);
    }
  });
}
}

Anuncios

Etiquetas: ,

One response to “Uso de GridBagLayout (y II)”

  1. Eloy-Caballo says :

    Creo que tu método para agregarles los constraints al GridBagLayout, es deficiente, ya que aunque usas un sulo objeto GridBagConstraints, creas una nueva instancia para cada componentes que agregas, aunque el Garbage collector de java una vez, creas este objeto y aunque se destruye la antigua referencia, esta va consumiendo algo de memoria hasta que el Garbage Collector la destruye, de manera que mi recomendacion es que como lo hiciste tu al principio, declaramos y creamos un solo objeto GridBagConstraints, luego solo tenemos que ir modificando los campos para cada componente en particular e ir agregando el componente con esa configuracion luego ir modificando y agregando, pero recuerda con el mismo objeto.

    Adios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: