Swing y JFC (Java Foundation Classes)

Con la clase JInternalFrame, se puede mostrar un JFrame - como una ventana dentro de otra ventana. Para crear un frame interno que parezca un di�logo sencillo, se pueden utilizar los m�todos showInternalXxxDialog de JOptionPane, como se explic� en C�mo crear Di�logos.

Normalmente, los frames internos se muestran dentro de un JDesktopPane.

JDesktopPane es una subclase de JLayeredPane al que se le ha a�adido el API para manejar el solapamiento de m�ltiples frames internos. Generalmente, se pone el panel superior dentro del panel de contenido de un JFrame. Para m�s informaci�n sobre el uso de API que JDesktopPane hereda de JLayeredPane, puedes ver C�mo usar LayeredPane.

Aqu� podemos ver una imagen de una aplicaci�n que tiene dos frames internos dentro de un frame normal.

Como se ve en la figura, los frames internos utilizan la decoraci�n de ventana del aspecto y comportamiento Metal. Sin embargo, la ventana que los contiene tiene decoraci�n de aspecto y comportamiento nativo (en este caso, Motif).

Intenta esto:
  1. Compila y ejecuta la aplicaci�n, Los ficheros fuentes son.

    InternalFrameDemo.java y MyInternalFrame.java.

  2. Crea nuevos frames internos utilizando el �tem Create en el men� Document.

    Cada frame interno viene 30 pixels por debajo y a la derecha de la posici�n del frame anterior. Esta funcionalidad se implementa en la clase MyInternalFrame, que es la subclase peronalizada de JInternalFrame.

El siguiente c�digo, tomado de InternalFrameDemo.java, crea el frame principal y los internos del ejemplo anterior.

./In the constructor of InternalFrameDemo, a JFrame subclass:
    desktop = new JDesktopPane(); //a specialized layered pane
    createFrame(); //Create first window
    setContentPane(desktop);
...
protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e2) {}
}

./In the constructor of MyInternalFrame, a JInternalFrame subclass:
static int openFrameCount = 0;
static final int xOffset = 30, yOffset = 30;

public MyInternalFrame() {
    super("Internal Frame #" + (++openFrameCount), 
          true, //resizable
          true, //closable
          true, //maximizable
          true);//iconifiable
    //...Create the GUI and put it in the window...
    //...Then set the window size or call pack...
    ...
    //Set the window's location.
    setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
}

.�Frames Internos frente a Frames Normales

El c�digo para utilizar frames internos es similar en muchas formas al c�digo para utilizar frames normales Swing. Como los frames internos tienen sus paneles ra�z, configurar el GUI para un JInternalFrame es muy similar a configurar el GUI para un JFrame. JInternalFrame tambi�n proporciona otro API, como pack, que lo hace similar a JFrame.

Como los frames internos no son ventanas, de alguna forma son diferentes de los frames. Por ejemplo, debemos a�adir un frame interno a un contenedor (normalmente un JDesktopPane). Un frame interno no genera eventos window; en su lugar, las acciones del usuario que podr�an causar que un frame dispara eventos windows hacen que en un frame interno se disparen eventos "internal frame".

Como los frames internos se han implementado con c�digo independiente de la plataforma, ofrecen algunas caracter�sticas que los frames no pueden ofrecer. Una de esas caracter�sticas es que los frames internos ofrecen m�s control sobre su estado y capacidades. Program�ticamente se puede minimizar o maximizar un frame interno. Tambi�n se puede especificar el icono que va en la barra de t�tulo del frame interno. Incluso podemos especificar si el frame tiene soporte de decoraci�n de ventanas, redimensionado, minimizaci�n, cerrado y maximizaci�n.

Otra caracter�stica es que los frames internos se han dise�ado para trabajar con paneles por capas. El API JInternalFrame contiene m�todos como moveToFront que funcionan s�lo si el contenedor de un frame interno es un layeredpane.

.�Reglas de utilizaci�n de Frames Internos

Si has construido alg�n programa utilizando JFrame y los otros componentes Swing, entonces ya sabes mucho sobre c�mo utilizar frames internos. La siguiente lista sumariza las reglas para la utilizaci�n de frames internos.

Se debe seleccionar el tama�o del frame interno.
Si no se selecciona el tama�o del frame interno, tendr� tama�o cero y nunca ser� visible. Se puede seleccionar el tama�o utilizando uno de estos m�todos: setSize, pack o setBounds.
Como regla, se debe seleccionar la posici�n del frame interno.
Si no se selecciona la localizaci�n, empezar� en 0,0 (la esquina superior izquierda de su contenedor). Se pueden utilizar los m�todos setLocation o setBounds para especificar la esquina superior izquierda del frame interno en relaci�n a su contenedor.
Para a�adir componentes a un frame interno, se a�aden al panel de contenidos del propio frame interno.
Es exactamente la misma situaci�n que JFrame. Puedes ver A�adir componentes a un Frame para m�s detalles.
Los di�logos que son frames internos deber�an implementarse utilizando JOptionPane o JInternalFrame, no JDialog.
Para crear un di�logo sencillo, podemos utilizar los metodos showInternalXxxDialog de JOptionPane, como se describi� en C�mo crear Di�logos. Observa que los di�logos en frames internos no son modales.
Un frame interno se debe a�adir a un contenedor
Si no lo a�adimos a un contenedor (normalmente un JDesktopPane), el frame interno no aparecer�.
Normalmente no se tiene que llamar a show o setVisible para los frames internos.
Al igual que los botones, los frames internos se muestran autom�ticamene cuando se a�aden a un contenedor visible o cuando su contenedor anteriormente invisible se hace visible.
Los frames internos disparan eventos "internal frame", no eventos "window".
El manejo de eventos "internal frame" es casi id�ntico al manejo de eventos "window". Para m�s informaci�n puedes ver C�mo escribir un oyente "Internal Frame".
Nota: Debido a un bug (#4128975), una vez que un frame interno a aparecido y luego ha sido ocultado, el frame interno no aparecer� otra vez. Si queremos mostrarlo de nuevo, tenemos que recrearlo, como lo hace InternalFrameEventDemo.java.

.�El API de InternalFrame

Las siguientes tablas listan los m�todos y constructores m�s utilizados de JInternalFrame. El API para utilizar frames internos se divide en estas categor�as.

Junto con el API listado abajo, JInternalFrame hereda un API �til desde JComponent, Container, y Component. JInternalFrame tambi�n proporciona m�todos para obtener y seleccionar objetos adicionales en su panel ra�z. Para m�s detalles puedes ver C�mo usar RootPane.

.�Crear un Frame Interno

Constructor Prop�sito
JInternalFrame()

JInternalFrame(String)

JInternalFrame(String, boolean)

JInternalFrame(String, boolean, boolean)

JInternalFrame(String, boolean, boolean, boolean)

JInternalFrame(String, boolean, boolean, boolean, boolean)

Crea un ejemplar de JInternalFrame. El primer argumento especificar el t�tulo (si existe) a mostrar por el frame interno. El resto de los argumentos especifican si el frame interno deber�a contener decoraci�n permitiendo al usuario que redimensione, cierre, maximice y minimice el frame interno (por este orden). El valor por defecto para cada argumento booleano es false, lo que significa que la operaci�n no est� permitida.
M�todos de la clase JOptionPane:
  • showInternalConfirmDialog
  • showInternalInputDialog
  • showInternalMessageDialog
  • showInternalOptionDialog
Crea un JInternalFrame que simila un di�logo.

.�A�adir Componentes a un Frame Interno

M�todo Prop�sito
void setContentPane(Container)

Container getContentPane()

Selecciona u obtiene el panel de contenido del frame interno, que generalmente contiene todo e GUI del frame interno, con la excepci�n de la barra de men� y las decoraciones de la ventana.
void setMenuBar(JMenuBar)

JMenuBar getMenuBar()

Selecciona u obtiene la barra de men� del frame interno. Observa que estos nombres de m�todo no contienen "J", al contrario que sus m�todos equivalentes de JFrame. En las siguientes versiones de Swing y del JDK 1.2, JInternalFrame a�adira setJMenuBar y getJMenuBar, que se deber�an utilizar en vez de los m�todos existentes.

.�Especificar el Tama�o y la Posici�n del Frame Interno

M�todo Prop�sito
void pack() Dimensiona el frame interno para que sus componentes tenga sus tama�os preferidos.
void setLocation(Point)

void setLocation(int, int)

Seleciona la posici�n del frame interno. (Heredada de Component).
void setBounds(Rectangle)

void setBounds(int, int, int, int)

Explicit�mente selecciona el tama�o y la localizaci�n del frame interno (Heredada de Component).
void setSize(Dimension)

void setSize(int, int)

Explicit�mente selecciona el tama�o del frame interno. (Heredada de Component).

.�Realizar Operaciones de Ventana sobre el Frame Interno

M�todo Prop�sito
void setDefaultCloseOperation(int)

int getDefaultCloseOperation()

Selecciona u obtiene lo que hace el frame interno cuando el usuario intenta "cerrar" el frame. El valor por defecto es HIDE_ON_CLOSE. Otros posibles valores son DO_NOTHING_ON_CLOSE y DISPOSE_ON_CLOSE.
void addInternalFrameListener(InternalFrameListener)

void removeInternalFrameListener(InternalFrameListener)

A�ade o elimina un oyente de "internal frame" (JInternalFrame es equivalente a un oyente de "window").
void moveToFront()

void moveToBack()

Si el padre del frame interno es un layeredpane, mueve el frame interno adelante o detr�s (respectivamente) por sus capas).
void setClosed(boolean)

boolean isClosed()

Selecciona u obtiene si el frame interno est� cerrado actualmente.
void setIcon(boolean)

boolean isIcon()

Minimiza o maximiza el frame interno, o determina si est� minimizado actualmente.
void setMaximum(boolean)

boolean isMaximum()

Maximiza o restaura el frame interno o determina si est� maximizado.
void setSelected(boolean)

boolean isSelected()

Selecciona u obtiene si el frame interno esta actualmente "seleccionado" (activado).

.�Controlar la Decoraci�n y las Capacidades de la Ventana

M�todo Prop�sito
void setFrameIcon(Icon)

Icon getFrameIcon()

Seleciona u obtiene el icono mostrado en la barra de t�tulo del frame interno (normalmente en la esquina superior izquierda).
void setClosable(boolean)

boolean isClosable()

Selecciona u obtiene si el usuario puede cerrar el frame interno.
void setIconifiable(boolean)

boolean isIconifiable()

Selecciona u obtiene si el frame interno puede ser minimizado.
void setMaximizable(boolean)

boolean isMaximizable()

Selecciona u obtiene si el usuario puede maximizar el frame interno.
void setResizable(boolean)

boolean isResizable()

Selecciona u obtiene si el frame interno puede ser redimensionado.
void setText(String)

String getText()

Selecciona u obtiene el t�tulo de la ventana.
void setWarningString(String)

String getWarningString()

Selecciona u obtiene cualquier string de aviso mostrado en la ventana.

.�Usar el API de JDesktopPane

M�todo Prop�sito
JDesktopPane() Crea un ejemplar de JDesktopPane.
JInternalFrame[] getAllFrames() Devuelve todos los objetos JInternalFrame que contiene el escritorio.
JInternalFrame[] getAllFramesInLayer(int) Devuelve todos los objetos JInternalFrame que contiene el escritorio y que est�n en la capa especificada. Para m�s informaci�n puedes ver C�mo usar LayeredPane.

COMPARTE ESTE ARTÍCULO

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