Toda ventana la implementaremos con JFrame o con JDialog

Para que una ventana sea funcional deberemos añadir los componentes que necesitemos, y eso lo hemos de hacer en contenedor que incorporan.

Según hemos visto antes, la secuencia será:

Ejemplo de JFrame

A partir de este momento, los componentes los podemos ir añadiendo en panel, con su método add(Component con).

Layouts

Los layouts son necesarios para controlar como se van a distribuir los componentes dentro de un contenedor. Lo primero que debemos hacer antes de empezar a añadir los componentes a un contenedor, es especificar la distribución o layout del mismo.

Vamos a revisar los siguientes Layouts:

FlowLayout

BorderLayout

CardLayout

BoxLayout

GridLayout

GridBagLayout

GroupLayout

SpringLayout

FlowLayout

El FlowLayout va situando los componentes en una línea de izquierda a derecha. Cuando la línea se llena,  encaja el conjunto en una fila del contenedor, y empieza otra. Es el layout por defecto de JPanel.

Constructores

FlowLayout() Construye un nuevo objeto en donde los componentes se irán alineando vertical y horizontalmente con una separación estándar de 5 pixeles
FlowLayout(int FlowLayout.xxxxxx) Controla la forma en que se van alineando los objetos
CENTER, LEADING,LEFT,RIGTH,TRAILING
FlowLayout(int FlowLayout.xxxxxx, int hgap, int vgap) Ademas de la alineación, controla la separación horizontal y vertical

BorderLayout

Este manejador coloca un componente en el centro del contenedor. El componente central es rodeado por hasta cuatro componentes situados en los bordes “Norte”, “Sur”, “Este”, y “Oeste” como se indica en el diagrama de la izquierda. Cada uno de los cuatro componentes del borde es opcional. El LayoutManager reserva primero espacio para los componentes del borde. Todo el espacio restante es para el componente central.

Si un contenedor emplea BorderLayout, los componentes deben ser añadidos al contenedor empleando el método add(string,Component). El primer parámetro especifica donde se va a colocar el componente. Deberá ser una de las siguientes cadenas: ”Center”, “North”, “South”, “East”, o “West”. (Estos nombres son sensibles a las mayúsculas/minúsculas por lo que si emplea por ejemplo “east” en lugar de “East”, puede encontrarse con la misteriosa desaparición de un componente. También dispone de la constantes  BorderLayout.NORTH),  BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST, BorderLayout.CENTER

Constructores

BorderLayout () Construye un nuevo objeto sin separación entre los componentes
BorderLayout (int hgap, int vgap) Establece separaciones verticales y horizontales del valor indicado

 

Por ejemplo, el siguiente código crea una ventana con botones distribuidos en las cinco zonas

 

CardLayout

La diferencia principal de este manejador, es que el contenedor que lo usa, solo mantiene visible un componente en un momento determinado. Piense en los componentes como en un conjunto de cartas. En cada momento, solo se ve una carta, pero puede saltar de una carta a otra. CardLayout proporciona métodos para saltar desde la primera carta a la última, y a la siguiente carta del paquete. Se puede especificar un nombre para cada carta que se añada al contenedor y hay métodos para saltar directamente a la carta con un nombre determinado.

Cada una de esas “cartas”, puede ser un contenedor como JPanel, por lo que cada uno implementara el layout que interese

Otros métodos que están disponibles son cards.last(cardPanel) y cards.next(cardPanel).

Nota : Observen que se ha creado la clase extendiendo JFrame por lo que ella ya es un Frame, y además se ha implementado ActionListener, para poder recibir los eventos que se produzcan; más adelante hablaremos de ello

 

BoxLayout

Este layout solo carga un componente en cada línea; la carga la podemos hacer horizontalmente o verticalmente

 

GridLayout

El GridLayout crea una rejilla de rectángulos del mismo tamaño y sitúa cada componente en una celda.

Constructores

GridLayout() Construye un layout con una columna y una fila
GridLayout(int row, int col) Construye un layout con row filas y col columnas
GridLayout(int row, int col, int hgap, int vgap) Construye un layout con row filas y col columnas, dejando hgap pixel entre filas y vgap pixels entre columnas

 

 

GridBagLayout

GridBagLayout es semejante a GridLayout en que el contenedor está dividido en filas y columnas de rectángulos. Sin embargo GridBagLayout es mucho más sofisticado porque no todas las filas han de tener la misma altura, así como las columnas tampoco han de tener todas la misma anchura, y los componentes pueden ocupar varias filas y varias columnas. Cada componente se asocia a una instancia de GridBagConstraints, que indica la posición del componente y el número de filas y columnas que ocupa.

 

 

 

GroupLayout

En este layout, se agrupan los componentes, para luego añadirlos al contenedor. La agrupación la hacemos por medio de las clases SequentialGroup y ParallelGroup.

Para verlo funcionando, vamos a preparar los datos a presentar, definiendo y configurando el Layout y asociándolo al panel, para obtener la pantalla que mostramos

Los grupos horizontales los creamos desde la visión de objetos que han de aparecer uno  encima de otro en distinta línea

Los grupos verticales los creamos con la visión de los objetos que van a ir en una misma línea

Por último, los añadimos al GroupLayout

Para finalizar la clase, se debe dar la orden de visualización

 

SpringLayout

Este layout permite indicar las coordenadas de cada objeto, con relación a otro cualquiera. Eso unido a poder indicar las distancias entre distintos puntos de los objetos, (BASELINE, EAST, HEIGHT, HORIZONTAL_CENTER, NORTH, SOUTH, VERTICAL_CENTER, WEST, WIDTH) lo hace muy útil cuando tenemos que diseñar objetos relacionados.

Veamos como aplicamos esto, partiendo de la definición que hemos preparado para otros ejercicios:

Ya hemos incorporado todos los objetos al panel; ahora iremos indicando donde se ubican; su posicionamiento en horizontal lo hacemos desde el borde izquierdo del panel al borde izquierdo del componente

La posición vertical de los botones la establecemos desde el NORTH del panel al NORTH del botón

Pero la posición de los letreros, la podemos establecer haciendo que el SOUTH del letrero coincida con el SOUTH del botón

Para finalizar la clase, se debe dar la orden de visualización

Elección de layout

La elección de un determinado layout va a estar influenciada por el tipo de diseño que tenga la ventana, el número de campos, o la distribución de los mismos.

Los casos que ofrecemos solo intentas ser una guía, pero si no encuentra una solución, siempre está el GridBagLayout y el SpringLayout, que a costa de más esfuerzo en definición, deja crear una gran cantidad de diseño.

Por último, muchas veces la solución pasa por dividir la pantalla en paneles, cada uno con el layout que se necesite, e integrarlos con el layout adecuado

Caso 1 – Se requiere un componente muy grande.

Se puede utilizar BorderLayout, situando ese componente en el centro. Si es un solo componente, puede utilizar GridLayout. Si no, otra alternativa es usar GridBagLayout creando la celda tan grande como se necesite. También puede utilizar BoxLayout estableciendo el tamaño del componente en preferido y máximo, suficientemente grande.

Caso 2 – Se requiere mostrar una fila de componentes.

Lo más sencillo seria agrupar esos componentes en un JPanel independiente y utilizar FlowLayout, o BoxLayout

Caso 3 – Varios componentes de similar tamaño en filas y columnas

Es la aplicación estándar de GridLayout.

Caso 4 – Varios componentes en una fila o en una columna, con tamaños diversos

Si es una fila o una columna, se puede utilizar BoxLayout

Si son varias filas y columnas irregulares, se puede pensar en una asociación de JPanel con BoxLayout horizontal, agrupados con BoxLayout vertical. El orden de agrupación vertical-horizontal, o horizontal-vertical, dependerá del diseño.

Caso 5 – Diseños tipo formulario, con columna de etiquetas y de campos

La propuesta inmediata es SpringLayout, aunque muchas veces es mas sencillo utilizar GridLayout o GridBagLayout

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.