Observando las clases directamente de la página de Sun Microsystem, tanto del JAVA SE 5 como del JAVA SE 6, puede verse que en este último fueron agregadas las siguientes clases:
DefaultRowSorter
DefaultRowSorter.Model
DefaultRowSorter.Wrapper
GroupLayout
JList.DropLocation
JTable.DropLocation
JTree.DropLocation
LayoutStyle
RowFilter
RowFilter.Entry
RowSorter
RowSorter.SortKey
SwingWorker
Para este artículo se explicará los fundamentos básicos para realizar interfaces gráficas con GroupLayout. Sin mas que esperar, empecemos:
Este administrador de disposición trabaja con eje vertical y horizontal separadamente. Cuando se ha definido la colocación de los componentes en uno de los ejes ya está la mitad del problema resuelto, se pasa luego a definir la colocación del mismo componente en el otro eje, si, esto quiere decir que cada componente debe estar presente tanto en el eje vertical como en el horizontal de no ser así el GroupLayout lanza una exception.
Este administrador de esquema puede organizar los componentes o secciones en forma secuencial o paralela: Secuencial significa uno al lado para el eje horizontal y uno arriba del otro para el vertical.
El paralelo significa colocar en una misma línea (vertical u horizontal) los elementos que necesite. Tanto si utiliza Secuencial como Paralelo se pueden agregar a ellos tanto componentes como nuevos grupos.
Veamos un ejemplo para aclarar las dudas que se hayan ir podido planteando hasta ahora:
Supongamos que queremos crear la siguiente interfaz gráfica:
Espero explicarme con estas dos imágenes a continuación; primero veamos la distribución horizontal:
Las líneas oscuras (negras) superiores reflejan la distribución mas externa de ese panel, como puede verse existe una disposición secuencial, de izquierda a derecha, por lo tanto si creamos primero en GroupLayout myLayout, lo primero que debemos hacer es definir esta distribución, de la siguiente manera:
myLayout.setHorizontalGroup( myLayout.createSequentialGroup()); |
Luego, se va definiendo o agregando el código de las secciones mas internas, por ejemplo, la primera sección contiene una distribución paralela de dos componentes, primero codificamos la sección paralela:
myLayout.setHorizontalGroup( myLayout.createSequentialGroup() .addGroup( myLayout.createParallelGroup()) ); |
Luego los componentes:
myLayout.setHorizontalGroup( myLayout.createSequentialGroup() .addGroup( myLayout.createParallelGroup() .addComponent(lblNombre) .addComponent(lblEmail) ) ); |
Como hemos dicho, cada sección puede contener tanto componentes como nuevos grupos, esto quiere decir que pueden haber grupos anidados, es decir, grupos dentro de otros grupos.
Un ejemplo de esto es cuando queremos colocar los JCheckBox. La sección horizontal media contiene un nuevo grupo, tal como lo muestra el código que sigue:
.addGroup(myLayout.createParallelGroup() .addComponent(txtNombre) .addComponent(txtEmail) .addGroup(myLayout.createSequentialGroup() .addGroup(myLayout.createParallelGroup() .addComponent(chkActualizacion) //etc... mas adelante está el código completo esto es sólo para explicación ) ); |
Pasemos ahora a definir nuestra distribución vertical:
En este caso puede verse también una distribución secuencial (de arriba hasta abajo) y en este caso un poco más sencillo debido a que cada sección contiene directamente los componentes, es decir, no hay subdivisiones o grupos anidados.
El código fuente final de el GroupLayoutExample queda de la siguiente manera:
GeSHi © 2004-2007 Nigel McNie, 2007-2009 Benny Baumann, 2008-2009 Milian Wolff
- package ejemploblog;
- import javax.swing.*;
- public GroupLayoutExample(){
- GroupLayout myLayout = new GroupLayout(this);
- setLayout(myLayout);
- //Crear espacio entre componentes
- myLayout.setAutoCreateGaps(true);
- //Crear espacio entre componente contenedor
- myLayout.setAutoCreateContainerGaps(true);
- myLayout.setHorizontalGroup( myLayout.createSequentialGroup()
- .addGroup(myLayout.createParallelGroup()
- .addComponent(lblNombre)
- .addComponent(lblEmail)
- )
- .addGroup(myLayout.createParallelGroup()
- .addComponent(txtNombre)
- .addComponent(txtEmail)
- .addGroup(myLayout.createSequentialGroup()
- .addGroup(myLayout.createParallelGroup()
- .addComponent(chkActualizacion)
- .addComponent(chkComentarios)
- )
- .addGroup(myLayout.createParallelGroup()
- .addComponent(chkCodigo)
- .addComponent(chkInfo)
- )
- )
- )
- .addGroup(myLayout.createParallelGroup()
- .addComponent(btnAceptar)
- .addComponent(btnOmitir)
- )
- );
- myLayout.setVerticalGroup(myLayout.createSequentialGroup()
- .addGroup(myLayout.createParallelGroup()
- .addComponent(lblNombre)
- .addComponent(txtNombre)
- .addComponent(btnAceptar)
- )
- .addGroup(myLayout.createParallelGroup()
- .addComponent(lblEmail)
- .addComponent(txtEmail)
- .addComponent(btnOmitir)
- )
- .addGroup(myLayout.createParallelGroup()
- .addComponent(chkActualizacion)
- .addComponent(chkCodigo)
- )
- .addGroup(myLayout.createParallelGroup()
- .addComponent(chkComentarios)
- .addComponent(chkInfo)
- )
- );
- }
- }
Parsed in 0.176 seconds at 12.76 KB/s
Para crear la clase ejecutable (main), sería:
GeSHi © 2004-2007 Nigel McNie, 2007-2009 Benny Baumann, 2008-2009 Milian Wolff
- package ejemploblog;
- import java.awt.BorderLayout;
- import javax.swing.JFrame;
- public class Aplicacion {
- marco.pack();
- marco.setVisible(true);
- }
- }
Parsed in 0.109 seconds at 3.64 KB/s
Bueno, esto es todo por ahora, espero haberme explicado en este artículo, si quieren un Tutorial completo (en inglés) sobre GroupLayout, busca en esta dirección:
How to Use GroupLayout
Donde hay inclusive otro ejemplo.
Hasta la próxima!