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:
NONE
: valor por defecto. Indica que el componente no cambiará su tamañoHORIZONTAL
: hará crecer el componente hasta completar el tamaño horizontal de la celda o celdas donde se encuentra el componenteVERTICAL
: igual queHORIZONTAL
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
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);
}
});
}
}