miércoles, 27 de octubre de 2010

CONTENEDORES EN JAVA Y SUS METODOS. LAYOUT.

CONTENEDORES EN JAVA Y SUS MÉTODOS
Un contenedor es un componente especial que permite contener en su interior a otros componentes, incluidos otros contenedores. Un contenedor posee, además de la habilidad de contener otros componentes, la de organizar dichos componentes en su interior.
Los contenedores descienden de la clase padre Container del paquete java.awt, la cual, a su vez, es descendiente directa de la clase Component
java.lang.Object    java.awt.Component       java.awt.Container
Esta clase posee los métodos comunes a todos los contenedores, como aquellos que permiten agregar componentes al contenedor, localizar componentes, establecer la organización o disposición de los componentes (layouts), etc.
Para agregar componentes a un contenedor existe un método llamado add (añadir, agregar), que posee diversas sintaxis:
1. public Component add (Component comp)  // Añade el componente al final del contenedor




2. public Component add (String name,     // Añade el componente al final del contenedor y
   Component comp)                      le asigna un nombre




3. public Component add (Component comp,  // Añade el componente en la posicion indicada
   int index)                           por index. Con –1 lo añade al final



4. public void add (Component comp,       // Añade el componente al final e indica
al
   Object constraints)                  Layout las restricciones (x, y, ancho y alto)



5. public void add (Component comp,       // Idem al anterior pero indicando que agregue
   Object constraints,                  el componente en la posicion index dentro de
   int index)                           la lista de componentes del contenedor


 
Para eliminar componentes del contenedor se utiliza el método remove, cuya sintaxis es la siguiente:
public remove (int index)     // Elimina el componente que hay en la posicion especificada                                                                    
public remove (Component comp) // Elimina el componente especificado por el contenedor

Si se desea vaciar el contenedor, el método removeAll es el método indicado:
public void removeAll ( )

public void removeContainerListener(ContainerListener l)// elimina el oyente de sucesos para containers de este container.

Para conocer el número de componentes que hay actualmente insertados en el contenedor, se puede utilizar el método siguiente:
public int getComponentCount ( )
Obtener el componente situado en un posición específica en la lista de componentes del contenedor es muy sencillo. Devuelve el enésimo componente introducido en el contenedor. El método getComponent se encarga de ello:
public Component getComponent (int n)
Es posible también obtener el componente en relación a unas coordenadas específicas dentro del contenedor. Para ello, hay varios métodos:
Component[] getComponents(), da todos los componentes introducidos en el contenedor.
public Component getComponentAt (int x, int y) public Component getComponentAt (Point p) public findComponentAt (int x, int y) public findComponentAt (Point p)

La diferencia entre el método getComponentAt y findComponentAt es que getComponentAt busca en el hijo más inmediato, mientras que findComponentAt puede buscar dentro de hijos anidados.
En este caso, si se desea conocer si un componente dado está contenido dentro del contenedor, existe un método:
public boolean isAncestorOf (Component c)
Este método retorna true si el componente está contenido dentro del contenedor, o false en caso contrario.
Los contenedores poseen la habilidad de pintar, y poseen varios métodos que sirven para pintar en el contenedor en un determinado momento:
public void paint (Graphics g)            // Cuando se dibuja todo el contenedor
public void update (Graphics g)           // Cuando se actualiza el contenedor
public void print (Graphics g)            // Cuando se imprime el contenedor
public void paintComponents (Graphics g)  // Cuando se dibuja cada componente
public void printComponents (Graphics g)  // Cuando se imprime cada componentes

Los contenedores poseen también la habilidad de validar o no su contenido. Esto se consigue gracias a algunos métodos especiales:
public void invalidate ( )   // Invalida el contenedor
public void validate ( )     // Valida el contenedor y sus subcomponentes
Cuando se invalida un contenedor, éste y sus padres son marcados como que necesitan reorganizarse. Cuando se valida el contenedor, el contenedor y sus subcomponentes son reorganizados. El uso habitual de estos métodos se realiza cuando se han añadido, eliminado o modificado sus subcomponentes.
Los contenedores poseen la facultad de organizar sus subcomponentes gracias a los Layouts (disposiciones u organizadores). Para gestionar dichos organizadores existen varios métodos, algunos de los cuales ya se han visto en capítulos anteriores:
public void setLayout (LayoutManager mgr) // Establece el tipo de disposicion
public LayoutManager getLayout ( )        // Obtiene el tipo de disposicion
public void doLayout ( )                  // Reorganiza la disposicion del contenedor
Las disposiciones u organizadores serán tratados más adelante dentro de este mismo tema dedicado a los contenedores.
Todos los métodos aquí vistos son comunes a todos los tipos de contenedores. Como se indicó desde un principio, la clase Container es la clase padre de los contenedores, y pone a disposición de las clases más especializadas (cada tipo de contenedor) estos métodos y los heredados de la clase Component.
Otros métodos:
public void addContainerListener (ContainerListener l), ajusta el ContainerListener que escuchará los sucesos que han ocurrido en el contenedor.
float getAlignmentX(), devuelve el ajuste de líneas a lo largo del eje X del contenedor.
float getAlignmentY(), devuelve el ajuste de líneas a lo largo del eje Y del contenedor.
Insets getInsets(), da un objeto Insets para el contenedor. Este objeto representa el tamaño (gráfico= del contenedor.
EventListener[] getListeners(Class listenerType), devuelve todos los oyentes de sucesos al contenedor.
Dimension getMaximumSize(), devuelve el tamaño máximo que puede tener el contenedor.
Dimension getMinimumSize(), devuelve el tamaño mínimo que puede tener el contenedor.
Dimension getPreferredSize(), devuelve el tamaño preferido por el contenedor.
void list(PrintStream out, int indent), imprime el listado de los componentes introducidos en el contenedor, sobre un stream de output.
void list(PrintWriter out, int indent), imprime en una impresora los componentes introducidos en el contenedor.
void setFont(Font f), ajusta las Font utilizadas por el texto en el contenedor.
void update(Graphics g), vuelve a dibujar el contenedor.
void validate(), anula el contenedor y sus componentes.


Tipos de contenedores
En sí, la clase Container no se utiliza directamente, pues es una clase abstracta que define el comportamiento de los distintos tipos de contenedores. Sin embargo, sí es utilizada para extenderla y crear clases más especializadas. No obstante, Java posee varios tipos de contenedores, dispuestos en la siguiente jerarquía:
java.lang.Object
   java.awt.Component
      java.awt.Container
         java.awt.Panel
            java.applet.applet
         java.awt.ScrollPane
         java.awt.Window
            java.awt.Dialog
               java.awt.FileDialog
            java.awt.Frame

Panel
Un panel es la clase de contenedor más simple, ya que únicamente proporciona el espacio para contener otros componentes y contenedores.

Applet
Un applet es un contenedor que deriva de la clase Panel. Además de proporcionar espacio para contener otros componentes, tiene la funcionalidad de ser una aplicación autónomo e independiente dentro de una página web.

ScrollPane
Este tipo de contenedor puede implementar desplazamientos horizontales y/o verticales para poder acceder a posiciones de sus componentes hijos, si éstos no son visualizados.

Window
Representa el nivel más básico de una ventana, sin bordes ni menús. Una instancia de una ventana no puede estar contenida dentro de otro contenedor.

Dialog
Es una especialización de una ventana, y muestra bordes y título, y es utilizada comúnmente como formularios de entrada por los usuarios.

FileDialog
Es una especialización de un diálogo (Dialog), permitiendo al usuario seleccionar navegar por los discos para seleccionar ficheros o archivos.

Frame
Un frame (marco) es una especialización de ventana y muestra bordes y título, y además pueden tener menús. La diferencia con los diálogos es que éstos son dependientes de una ventana padre. Si esta ventana padre se minimiza, se restaura o se cierra, automáticamente los diálogos también se minimizan, se restauran o se cierran. Además, los diálogos pueden redimensionarse o moverse, pero no minimizarse ni maximizarse.





LAYOUT


En algunos entornos los componentes se colocan con coordenadas absolutas. En Java se desaconseja esa práctica porque en muchos casos es imposible prever el tamaño de un componente.

En su lugar se utilizan administradores de diseño que permiten realizar colocaciones y maquetaciones de forma independiente de las coordenadas.

Un Layout  es una clase que hay dentro de las ventanas y de los paneles donde se colocan otros componentes, como botones, listas, menús, etc. Esta clase Layout es la que decide cómo se van a colocar esos componentes, si en forma de matriz, en fila, en columnas, etc.
Java tiene tiene muchos Layouts disponibles, cada uno de ellos coloca los botones que recibe de una forma especial dentro de la ventana.

El método setLayout dentro de la clase Container es el encargado de proporcionar un administrador de diseño a un determinado panel. Este método tiene como único parámetro un objeto de tipo LayoutManager. LayoutManager, es una
interfaz implementada en diversas clases que sirven para maquetar (FlowLayout, GridLayout, BoxLayout, BorderLayout, GridBagLayout,...)

La adición de elementos se puede crear con el método add. A veces no se muestran los cambios en el contenedor, para forzarles hay que utilizar el método validate que poseen los contenedores.
 
·        Flow Layout.
Distribuye los componentes del contenedor de izquierda a derecha y de arriba abajo. Es la distribución más fácil y una de las más efectivas.
 
   

·               Grid Layout
 
Crea distribuciones en forma de malla que posee una serie de columnas y filas. Estas filas y columnas crean celdas de exactamente el mismo tamaño. Los componentes se distribuyen desde la primer celda a la izquierda de la primera fila; y van rellenando fila a fila toda la malla hasta la celda más a la derecha de la última fila.


·          GridBag Layout
Es igual que la composición de GridLayout, con la diferencia que los Componentes no necesitan tener el mismo tamaño.

·          Card Layout
Este es el tipo de composición que se utiliza cuando se utiliza cuando se necesita una zona de la ventana que permita colocar distintos Componentes en esa misma zona.

·        Border Layout
Permite colocar componentes alrededor de los bordes de un contenedor. Por defecto es lo que utiliza AWT (y por lo tanto las clases Swing). Los bordes son NORTH. SOUTH,  EAST, WEST y CENTER. Se suele utilizar estas formas en el método add para  colocar componentes en el panel deseado:
 

·        BoxLayout.
Permite distribuir componentes en una fila o columna. Pensado para filas y columnas de botones, pertenece al paquete javax.swing (las anteriores están en java.awt).

Para facilitar su manejo, Swing incluye un contenedor llamado Box que está pensado para manipular los componentes insertados en
el contenedor. Box es una clase que posee diversos métodos estáticos que manipular internamente el administrador BoxLayout. Para crear un contenedor Box:
 
ESTA SERÁ LA OPCION PARA PEGAR MI TAREA DE POO ??????????