Red social para profesionales IT

Ingresar
  • Páginas
  • Java
  • Swing: pasos para crear layouts utilizando GridBagLayout- parte 2

Swing: pasos para crear layouts utilizando GridBagLayout- parte 2


En el ejemplo anterior vimos una introducción al uso de las propiedades de posicionamiento y de padding interno.  Ahora vamos a hablar de dos propiedades que son las que mas problemas traen.

Vamos a crear una ventana con dos botones sin padding; solo vamos a utilizar la propiedad de posicionamiento.

JPanel mainPanel = (JPanel) getContentPane();

mainPanel.setLayout(new GridBagLayout());

mainPanel.setBorder(BorderFactory.createTitledBorder("Content pane"));

GridBagConstraints c = new GridBagConstraints();

c.gridx = 0; // columna

c.gridy = 0; // fila

JButton boton1 = new JButton("Boton 1");

mainPanel.add(boton1, c);

c.gridx = 1; // columna

c.gridy = 0; // fila

JButton boton2 = new JButton("Boton 2");

mainPanel.add(boton2, c);

La ventana con los dos botones quedaría asi:

image

 

Ahora si estiramos la ventana, vemos que los dos botones permanecen juntos;  no se estiran para ocupar el espacio incrementado.

image

 

Si lo que queremos es que al estirarse la ventana, las celdas con sus componentes aprovechen el espacio incrementado, tenemos que utilizar las propiedades weightx y weighty.

Estos dos constraints especifican como el espacio restante del container ( en este caso la ventana ) debe distribuirse entre las celdas.    weightx espeficica como distribuir el espacio restante horizontalmente, en cambio weighty como distribuirlo de forma vertical.  Los valores que pueden tomar weightx weighty están comprendidos entre 0.0 y 1.0.   Estos valores representan el porcentaje de espacio restante que se le asignará a cada celda.  

Supongamos que queremos que el  "Boton1"  ocupe todo el espacio restante.  El "Boton2" solo ocupará el espacio comprendido por su tamaño, en tanto todo el espacio restante por haber estirado la ventana, será utilizado por la celda del  "Boton1", 50% a la izquierda y el otro 50% a la derecha.   Para que tenga dicho comportamiento, al constraint del "Boton1" le asignamos c.weightx = 1, en tanto al "Botón2" c.weighty = 0. Veamos el ejemplo: 

 

JPanel mainPanel = (JPanel) getContentPane();

mainPanel.setLayout(new GridBagLayout());

mainPanel.setBorder(BorderFactory.createTitledBorder("Content pane"));

GridBagConstraints c = new GridBagConstraints();

 

c.weightx = 1;   // 100% del espacio restante

c.gridx = 0; // columna

c.gridy = 0; // fila

JButton boton1 = new JButton("Boton 1");

mainPanel.add(boton1, c);

 

c.weightx = 0;   // no le asignamos espacio extra 

c.gridx = 1; // columna

c.gridy = 0; // fila

JButton boton2 = new JButton("Boton 2");

mainPanel.add(boton2, c);

 

Si nos fijamos el "Boton2" queda alejado del "Boton1" que a provecha todo el espacio incrementado.

image

Source

 

Ahora vamos a asignarle los valores c.weightx = 1 al "Boton1" y al "Boton2".  Vemos que los dos botones se reparten por igual el espacio restante del container (JFrame).

image

Source

 

Veamos que pasa si al primer botón le asignamos el 30% (weightx= 0.3) del espacio restante y al segundo botón el restante (weightx=1 o weightx=0.7).

image

El "Boton1" ocupa el 30%  del espacio, por eso si bien se aleja del "Boton2", vemos que queda un espacio entre el container y el botón.  El "Boton2" aprovecha el espacio que queda, osea el 70%, 35% para la izquierda y 35 a la derecha.

La propiedad weighty funciona exactamente de la misma manera, solo que antes de aprovechar el espacio horizontal, toma el espacio vertical.

 

Puede visitar la página de Sun sobre GridBagLayout o Java Swing 2nd Edition donde encontrará código de ejemplo.