Swing y JFC (Java Foundation Classes)

En general, no se crea directamente un objeto JRootPane. En su lugar, se obtiene un JRootPane (tanto si se quiere como si no!) cuando se ejemplariza un JInternalFrame o uno de los contenedores Swing de alto nivel -- JApplet, JDialog, JFrame, y JWindow.

La p�gina Reglas Generales para Usar Componentes Swing explica lo b�sico sobre el uso de paneles ra�z -- obtener el panel de contenido, seleccionar su controlador de distribuci�n, y a�adirle componentes Swing. Esta p�gina explica m�s cosas sobe los paneles ra�z, incluyendo los componentes que crean un panel ra�z, y c�mo poder utilizarlos.

Un panel ra�z se divide en cuatro partes.

El Panel de Cristal
Oculto, por defecto. Si se hace visible, es como si se pusiera una hoja de cristal sobre las otras partes del panel raiz. Es completamente transparente (a menos que hagamos que el m�todo paint haga algo) e intercepta los eventos de entrada para el panel ra�z. En la siguiente secci�n, veremos un ejemplo de utilizaci�n de un panel de cristal.
El panel de capas
Sirve para posicionar sus contenidos, que consisten en el panel de contenido y la barra de men� opcional. Tambi�n puede contener otros componentes en un orden Z especificado. Para m�s informaci�n puedes ver C�mo usar Layered Panes.
El Panel de Contenido
El contenedor de los componentes visibles del panel ra�z, excluyendo la barra de men�.
La barra de men� opcional
El hogar para los men�s del panel de contenido. Si el contenedor tiene una barra de men�s, generalmente se utilizan los m�todos setMenuBar o setJMenuBar del contenedor para poner la barra de men� en el lugar apropiado.

.�El Panel de Cristal

El panel de cristal es �til cuando queremos poder capturar eventos o dibujar sobre un �rea que ya contiene uno o m�s componentes. Por ejemplo, podemos desactivar los eventos de rat�n para una regi�n multi-componente haciendo que el panel de cristal intercepte los eventos. O podemos mostrar un cursor de espera sobte en panel ra�z completo utilizando el panel de cristal.

Aqu� podemos ver una imagen de una aplicaci�n que demuestra las caracter�sticas del panel de cristal. Contiene un checkbox que permite seleccionar si el panel de cristal es "visible" -- se puede obtener eventos y dibujar sobre su propia parte de pantalla. Cuando un panel de cristal es visible, bloquea todas las entradas desde los componentes del panel de contenidos. Tambi�n dibuja un punto rojo donde se detect� el �ltimo evento de pulsaci�n de rat�n.

Intenta esto:
  1. Compila y ejecuta la aplicaci�n. El fichero fuente es GlassPaneDemo.java.
  2. Pulsa le bot�n 1.

    La apariencia del bot�n cambia para indicar que ha sido pulsado.

  3. Pulsa el checkbox para que el panel de cristal se vuelva "visible", y luego pulsa el bot�n 1, otra vez.

    El bot�n no detecta la pulsaci�n del rat�n porque el panel de cristal la ha interceptado. Cuando el panel de cristal detecta el evento, suena un pitido y dibuja un c�rculo rojo donde se puls�.

  4. Pulsa de nuevo sobre el checkbox para ocultar el panel de cristal.

    Cuando el panel ra�z detecta un evento sobre el checkbox, lo reenv�a al checkbox. De otro modo, el checkbox no podr�a responder a las puslaciones.

El siguiente c�digo de GlassPaneDemo.java muestra y oculta el panel de cristal. Sucede que este programa para crear su propio panel de cristal lo selecciona utilizando el m�todo setGlassPane de JFrame. Sin embargo, si un panel de cristal no hace ning�n dibujo, el programa podr�a simplemente a�adir oyentes al panel de cristal por defecto, como los devueltos por getGlassPane.

./where GlassPaneDemo's UI is initialized:
JCheckBox changeButton =
        new JCheckBox("Glass pane \"visible\"");
changeButton.setSelected(false);
changeButton.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent e) {
        myGlassPane.setVisible(e.getStateChange()
                               == ItemEvent.SELECTED);
    }
});

El siguiente fragmento de c�digo implementa el manejo de eventos de raton para el panel de cristal. Si ocurre un evento de rat�n sobre el checkbox o la barra de men�s, entonces el panel de cristal redirecciona el evento para que el checkbox o el men� lo reciban. Para que el checkbox y el men� se comporten apropiadamente, tambi�n reciben todos los eventos drag que empiezan con una pulsaci�n en el checkbox o en la barra de men�.

./In the implementation of the glass pane's mouse listener:
public void mouseMoved(MouseEvent e) {
    redispatchMouseEvent(e, false);
}

.* The mouseDragged, mouseClicked, mouseEntered,
    * mouseExited, and mousePressed methods have the same
    * implementation as mouseMoved*/...

public void mouseReleased(MouseEvent e) {
    redispatchMouseEvent(e, true);
    inDrag = false;
}

private void redispatchMouseEvent(MouseEvent e, boolean repaint) {
    boolean inButton = false;
    boolean inMenuBar = false;
    Point glassPanePoint = e.getPoint();
    Component component = null;
    Container container = contentPane;
    Point containerPoint = SwingUtilities.convertPoint(
                                    glassPane,
                                    glassPanePoint,
                                    contentPane);
    int eventID = e.getID();

    if (containerPoint.y < 0) {
        inMenuBar = true;
        //...set container and containerPoint accordingly...
        testForDrag(eventID);
    }

    component = SwingUtilities.getDeepestComponentAt(
                                    container,
                                    containerPoint.x,
                                    containerPoint.y);

    if (component.equals(liveButton)) {
        inButton = true;
        testForDrag(eventID);
    }

    if (inMenuBar || inButton || inDrag) {
        ./Redispatch the event to component...
    }

    if (repaint) {
        toolkit.beep();
        glassPane.setPoint(glassPanePoint);
        glassPane.repaint();
    }
}

private void testForDrag(int eventID) {
    if (eventID == MouseEvent.MOUSE_PRESSED) {
        inDrag = true;
    }
}

Aqu� est� el c�digo que implementa el dibujo para el panel de cristal.

./where GlassPaneDemo's UI is initialized:
myGlassPane = new MyGlassPane(...);
frame.setGlassPane(myGlassPane);
...
/**
 * We have to provide our own glass pane so that it can paint.
 */
class MyGlassPane extends JComponent {
    Point point = null;

    public void paint(Graphics g) {
    	if (point != null) {
	    g.setColor(Color.red);
    	    g.fillOval(point.x - 10, point.y - 10, 20, 20);
    	}
    }
    ...
}

.�El API de Root Pane

Las siguientes tablas listan el API para utilizar paneles ra�z, paneles de cristal y paneles de contenido.

El API para utilizar otras partes del panel ra�z se describe en .

.�Usar un Panel Ra�z

M�todo Prop�sito
JRootPane getRootPane()

(en JApplet, JDialog, JFrame, JInternalFrame, y JWindow)

Obtiene el panel ra�z del applet, dialog, frame, internal frame, o window.
JRootPane SwingUtilities.getRootPane(Component) Si el componente tiene un panel ra�z, lo devuelve. Si no es as�, devuelve el panel ra�z (si existe) que contiene el componente.
JRootPane getRootPane()

(en JComponent)

Invoca al m�todo SwingUtilitiesgetRootPane sobre JComponent.
void setDefaultButton(JButton)

JButton getDefaultButton()

Selecciona u obtiene qu� bot�n (si existe) es el bot�n por defecto del panel ra�z. Una acci�n espec�fica del aspecto y comportamiento, como pulsar ENTER, hace que se realice la acci�n del bot�n.

.�Seleccionar u Obtener el Panel de Cristal

M�todo Prop�sito
setGlassPane(Component)

Component getGlassPane()

(en JApplet, JDialog, JFrame, JInternalFrame, JRootPane, y JWindow)

Selecciona u obtiene elpanel de cristal.

.�Usar el Panel de Contenido

M�todo Prop�sito
setContentPane(Container)

Container getContentPane()

(en JApplet, JDialog, JFrame, JInternalFrame, JRootPane, y JWindow)

Selecciona u obtiene el panel de contenido.

COMPARTE ESTE ARTÍCULO

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