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:
|
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:
|
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. |