Swing y JFC (Java Foundation Classes)

Un LayeredPane es un componente Swing que proporciona una tercera dimensi�n para posicionar componentes: profundidad, tambi�n conocida como eje Z. Cuando se a�ade un componente a un panel por capas, se especifica su profundidad.

Los frames con mayor profundidad siempre solapan los frames con menor profundidad y los frames con menor profundidad siempre est�n debajo de frames con mayor profundidad. Los frames con la misma profundidad pueden cambiar su posici�n. Por conveniencia, LayeredPane define varias layers (capas) dentro del rango posible de profundiades para funciones espec�ficas. Por ejemplo, podemos poner un componente en la capa de mayor funcionalidad, la capa de arrastre, cuando se arrastan componentes.

Todo contenedor Swing que tiene un panel ra�z -- como JFrame, JApplet, JDialog, y JInternalFrame -- autom�ticamente tiene un layeredpane, aunque la mayor�a de los programas no los utilizan expl�citamente. Podemos crear nuestro propio layeredpane y utilizarlo en cualquier lugar como un contenedor normal Swing.

Swing proporciona dos clases de paneles por capas. La primera, JLayeredPane, es la clase que utilizan los paneles ra�z. La segunda, JDesktopPane, es una subclase de JLayeredPane que est� especializada para contener frames internos. El ejemplo de esta secci�n utiliza un ejemplar de JLayeredPane. Para ver ejemplos de utilizaci�n de JDesktopPane puedes ir a C�mo usar Frames Internos.

Aqu� podemos ver una imagen de una aplicaci�n que utiliza paneles de capas para manejar JInternalFrames en diferentes capas.

Intenta esto:
  1. Compila y ejecuta la aplicaci�n. El fichero fuente es LayeredPaneDemo.java. Tambi�n necesitar�s cinco ficheros de im�genes: Bird.gif, Cat.gif, Dog.gif, Rabbit.gif, y Pig.gif.
  2. Cuando arranca, el programa crea cinco frames internos. Para crear otro frame, selecciona una capa desde el combo box luego pulsa el bot�n Create a Frame.
  3. Mueve los frames alrededor. Observa la relaci�n de los frames en las diferentes capas y los frames de al misma capa.
  4. Observa que se puede arrastrar un frame interno sobre los controles de la parte superior del programa. Los controles est�n en el panel de contenido del frame principal que est� en una capa inferior a todas las capas disponibles desde el men�.

Las clases JFrame, JApplet, JDialog, y JInternalFrame proporcionan un m�todo de conveniencia, getLayeredPane, para obtener el panel ra�z del layeredpane.LayeredPaneDemo.java utiliza este m�todo para obtener el layeredpane al que a�adirle los frames internos.

public class LayeredPaneDemo extends JFrame ... {
    ...
    public LayeredPaneDemo() {
        ...
        layeredPane = getLayeredPane();
    ...

Aqu� puedes ver el c�digo que crea y a�ade frames internos al layeredpane.

private void addNewInternalFrame(int index) {
    JInternalFrame newFrame = new JInternalFrame();
    ...
    numFrames++;
    newFrame.setBounds(30*(numFrames%10), 30*(numFrames%10)+55, 200, 160);
    ...
    Integer layer = layerValues[index];
    layeredPane.add(newFrame, layer);
    try { newFrame.setSelected(true); } 
    catch (java.beans.PropertyVetoException e2) {}
}

Las l�neas en negrita muestran d�nde se a�ade al frame al layeredpane. El m�todo add utilizado en este programa toma dos argumentos. El primero es el componente a a�adir; el segundo es un Integer indicando la profundidad donde poner el componente. El valor puede ser cualquier Integer. Sin embargo, la mayor�a de los programas utilizar�n uno de aquellos definidos por la clase JLayeredPane.

Nombre de Capa Valor Descripci�n
FRAME_CONTENT_LAYER new Integer(-30000) Esta capa es utiliza pra posicionar el panel de contenido del frame y la barra de men�. La mayor�a de los programas no la utilizar�n.
DEFAULT_LAYER new Integer(0) La mayor�a de los componentes van en esta capa.
PALETTE_LAYER new Integer(100) Esta capa es �til para paletas y barras de herramientas flotantes.
MODAL_LAYER new Integer(200) Los di�logos modales, como aquellos proporcionados por JOptionPane, pertenecen a esta capa.
POPUP_LAYER new Integer(300) Los desplegables van en esta capa porque necesitan aparecer por encima de todo.
DRAG_LAYER new Integer(400) Un componente se mueve a esta capa cuando se arrasta. Se debe devolver el componente a su capa normal cuando se suelta.

La posici�n de un componente determina su relaci�n con otros componentes de la misma capa. Al contrario que los n�meros de capas, cuando m�s bajo sea el n�mero de posici�n m�s alto estar� el componente en su capa.

Se puede seleccionar la posici�n de un componente cuando se le a�ade al layeredpane proporcionando un tercer argumento al m�todo add. Las posiciones se especifican con un int entre -1 y (N-1), donde N es el n�mero de componentes en la capa. Utilizar -1 es lo mismo que utilizar N-1; indica la posici�n m�s inferior. Utilizar 0 especifica que el componente deber�a ir en la posici�n superior de su capa. Como se ve en la siguiente figura, con la excepci�n de -1, un n�mero de posici�n menor indica una posici�n superior dentro de la capa.

Tanto la capa de un componente como su posici�n relativa dentro de la capa pueden cambiar. Para cambiar la capa de un componente normalmente se utiliza el m�todo setLayer. Para cambiar la posici�n de un componente dentro de su capa, se puede utilizar los m�todos moveToBack y moveToFront proporcionados por JLayeredPane.

Una Nota de Precauci�n: Cuando se a�ade un componente a una LayeredPane se especifica la capa con un Integer. Cuando se utiliza setLayer para cambiar al capa de un componente, se utiliza un int. Mira las tablas que hay abajo para comprobar los tipos de los argumentos y de los valores de retorno para otros m�todos de esta clase que trabajan con capas.

.�El API LayeredPane

Las siguientes tablas listan los m�todos y constructores m�s utilizados de la clase JLayeredPane. Otros m�todos interesantes est�n definidos por las clases JComponent y Component.

El API para utilizar LayeredPane se divide en estas categor�as.

.�Crear u Obtener un LayeredPane

M�todo Prop�sito
JLayeredPane() Crea un LayeredPane.
JLayeredPane getLayeredPane()

(en JApplet, JDialog, JFrame, y JInternalFrame)

Obtiene el LayeredPAne en un applet, dialog, frame, o frame interno.

.�Situar Componentes en Capas

M�todo Prop�sito
void add(Component, Integer)

void add(Component, Integer, int)

A�ade el componente especificado al layeredpane. El segundo argumento indica la capa. El tercer argumento, cuando existe, indica la posici�n del componente dentro de la capa.
void setLayer(Component, int)

void setLayer(Component, int, int)

Cambia la capa del componente. El segundo argumento indica la capa, el tercer argumento, cuando existe, indica la posici�n del componente dentro de la capa.
int getLayer(Component)

int getLayer(JComponent)

Obtiene la capa del componente especificado.
int getComponentCountInLayer(int) Obtiene el n�mero de componentes en la capa especificada. El valor devuelto por este m�todo puede ser �til para calcular los valores de posici�n.
Component[] getComponentsInLayer(int) Obtiene un array con todos los componentes en el capa especificada.
int highestLayer()

int lowestLayer()

Calcula la capa m�s alta o m�s baja actualmente utilizadas.

.�Posicionar Componentes en una Capa

M�todo Prop�sito
void setPosition(Component, int)

int getPosition(Component)

Selecciona u obtiene la posici�n del componente especificado dentro de su capa.
void moveToFront(Component)

void moveToBack(Component)

Mueve el componente especificado adelante o atr�s en su capa.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR