17 de mayo de 2010

GridBagLayout combinado con BoxLayout

Con los layout managers podremos organizar  los componentes dentro de un contenedor para darle el aspecto deseado a una GUI (interfaz grafica de usuario) en java.
Hay varios tipos de layout manager para utilizar en java en este post voy a poner en ejemplo la combinación de BoxLayout y el GridbagLayout.

BoxLayout: Es un layout manager que permite agrupar los componentes de forma horizontal o vertical dentro del contenedor.
Pertenece a la librería javax.swing.

GridBagLayout: Es un layout manager con el que tenemos control absoluto sobre las posiciones que ocuparán los objetos dentro del contenedor al que fue asignado.

Un JFrame es un contenedor de alto nivel que incluye varios contenedores y pertenece a la librería javax.swing, uno de estos contendores es el contentPane.

El contentPane es un contenedor intermedio de JFrame que debe ser creado explícitamente, a este se le va a añadir la mayoría de los componentes gráficos.
El contentPane usualmente es un JPanel y usa toda la ventana si el JFrame no incluye algún menús.

Primero vamos extender la clase JFrame y vamos a crear el contentPane este va a funcionar como nuestro contenedor principal.

Luego asignamos a contentPane BoxLayout ya que por defecto el layout del contentPane es BorderLayout, con Y_AXIS le indicamos que los paneles van a ser organizados verticalmente de arriba a abajo.

Lo siguiente es crear los dos JPanel, le asignamos GridBagLayout ya que por defecto el layout que tienen es FlowLayout.

Instanciamos GridBagConstraints que en cada JPanel, este va a se el que permita especificar con los atributos exactamente como se mostrará cada elemento dentro del contenedor.
Los atributos que vamos a utilizar van a ser:
  • gridx y gridy: Especifican las coordenadas horizontal y vertical del componente que vamos a insertar en el grid.
  • gridwidth y gridheight: Van a especificar el número de celdas que ocupará un componente dentro del grid.
  • weightx y weighty :Permiten que las celdas ocupen la totalidad del contenedor a través de  especificarle el porcentaje de espacio libre tanto horizontal como vertical.
  • Insets: Sirve para especificar el padding de cada uno de los componentes dentro de la celda.

Después lo que hacemos es asignar los paneles a contentPane, crear el método main y instanciar nuestra clase.

Este es el código del ejemplo:

import javax.swing.*;//Importamos la librería swing
import java.awt.*;//Importamos la librería awt

public class EjemploLayouts extends JFrame {

 public EjemploLayouts(){
     //Le pasamos el titulo con el constructor de la Superclase
     super("Ejemplo Layouts");
     //Crear ContentPane
     Container container = getContentPane();
     //Asignar a ContentPane el layout BoxLayout
     container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));

     //Crear el primer JPanel
     JPanel panelUno = new JPanel();
     //Asignar al primer JPanel un borde negro con un titulo de borde
     panelUno.setBorder(BorderFactory.createLineBorder(Color.black));
     panelUno.setBorder(BorderFactory.createTitledBorder("Este es el Panel 1"));

     //Asignar a panelUno el layout GridBagLayout
     panelUno.setLayout(new GridBagLayout());
     //instanciar GridBagConstraints para poder utilizar los atributos
     GridBagConstraints constUno = new GridBagConstraints();

     JLabel  etiquetaUno = new JLabel("Esta es la etiqueta Uno");
     constUno.gridx = 0; // La etiqueta empieza en la columna cero.
     constUno.gridy = 0; // La etiqueta empieza en la fila cero.
     constUno.gridwidth = 1; // La etiqueta ocupa una columna.
     constUno.gridheight = 1; // La etiqueta ocupa una fila.
     constUno.insets = new Insets(100,20,0,0);//Le asignamos padding a la etiqueta
     constUno.weightx = 0.5;//Le decimos que tiene que tomar el 50% del espacio libre en x
     constUno.weighty = 0.5;//Le decimos que tiene que tomar el 50% del espacio libre en y
     panelUno.add (etiquetaUno, constUno);//Asigno a panelUno la etiqueta con sus atributos
     constUno.insets = new Insets(0,0,0,0);//Reset el atributo Insets
     constUno.weightx = 0;//Reset el atributo weightx
     constUno.weighty = 0;//Reset el atributo weighty

     JButton botonUno = new JButton("Este es el botón Uno");
     constUno.gridx = 1; // El botón empieza en la columna uno.
     constUno.gridy = 0; // El botón empieza en la fila cero.
     constUno.gridwidth = 1; // El botón ocupa una columna.
     constUno.gridheight = 1; // El botón ocupa una fila.
     constUno.insets = new Insets(0,0,100,20);//Le asignamos padding al boton
     constUno.weightx = 0.5;//Le decimos que tiene que tomar el 50% del espacio libre en x
     constUno.weighty = 0.5;//Le decimos que tiene que tomar el 50% del espacio libre en y
     panelUno.add (botonUno, constUno);//Asigno a panelUno el botón con sus atributos
     constUno.insets = new Insets(0,0,0,0);//Reset el atributo Insets

     //No reseteamos los atributos ya que no hay mas componentes para incluir en planelUno

     //Crear el segundo JPanel
     JPanel panelDos = new JPanel();
     //Asignar al segundo JPanel un borde negro con un titulo de borde
     panelDos.setBorder(BorderFactory.createLineBorder(Color.black));
     panelDos.setBorder(BorderFactory.createTitledBorder("Este es el Panel 2"));

     //Asignar a panelDos el layout GridBagLayout
     panelDos.setLayout(new GridBagLayout());
     //instanciar GridBagConstraints para poder utilizar los atributos
     GridBagConstraints constDos = new GridBagConstraints();

     JButton botonDos = new JButton("Este es el botón Dos");
     constDos.gridx = 0; // El botón empieza en la columna uno.
     constDos.gridy = 1; // El botón empieza en la fila uno.
     constDos.gridwidth = 1; // El botón ocupa una columna.
     constDos.gridheight = 1; // El botón ocupa una fila.
     constDos.insets = new Insets(0,0,100,20);//Le asignamos padding al boton
     constDos.weightx = 0.5;//Le decimos que tiene que tomar el 50% del espacio libre en x
     constDos.weighty = 0.5;//Le decimos que tiene que tomar el 50% del espacio libre en y
     panelDos.add (botonDos, constDos);//Asigno a panelDos el botón con sus atributos
     constDos.insets = new Insets(0,0,0,0);//Reset el atributo Insets
     constDos.weightx = 0;//Reset el atributo weightx
     constDos.weighty = 0;//Reset el atributo weighty

     JLabel  etiquetaDos = new JLabel("Esta es la etiqueta Dos");
     constDos.gridx = 1; // La etiqueta empieza en la columna uno.
     constDos.gridy = 1; // La etiqueta empieza en la fila uno.
     constDos.gridwidth = 1; // La etiqueta ocupa una columna.
     constDos.gridheight = 1; // La etiqueta ocupa una fila.
     constDos.insets = new Insets(100,20,0,0);//Le asignamos padding a la etiqueta
     constDos.weightx = 0.5;//Le decimos que tiene que tomar el 50% del espacio libre en x
     constDos.weighty = 0.5;//Le decimos que tiene que tomar el 50% del espacio libre en y
     panelDos.add (etiquetaDos, constDos);//Asigno a panelDos la etiqueta con sus atributos

     //No reseteamos los atributos ya que no hay mas componentes para incluir en planelDos

     //Asignamos paneles a contentPane
     add(panelUno);
     add(panelDos);

     }

 public static void main(String [] args){

     EjemploLayouts ejemplo = new EjemploLayouts();//Instanciamos la clase
     ejemplo.setSize(400, 400);//Le pasamos valores de largo y ancho
     ejemplo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//Le asignamos la salida al Frame
     ejemplo.setVisible(true);//Lo hacemos visible

     }
}

Este ejemplo lo pude realizar gracias al estudio de estos dos(descargar, descargar) documentos que encontré en la Web espero les sea de ayuda.

1 comentario:

Esteban dijo...

mmmm muy interesante cuando pueda lo pruebo!!

Publicar un comentario