Cómo escribir un oyente de Window

Los eventos Windows son generados por una ventana justo después de que sea abierta, cerrada, iconificada, desiconificada, activada o desactivada. Abrir una ventana significa mostrarla por primera vez; cerrarla significa eliminarla de la ventana. Iconificarla significa sustiuirla por un pequeño icono en el escritorio; desiconificarla significa lo contrario. Una ventana es activada si uno de sus componentes tiene el foco del teclado; la desactivación ocurre cuando la ventana y todos sus componentes pierden el foco del teclado.

El uso más común de los oyentes de windows es cerrar ventanas. Si un programa no maneja los eventos de window-closing, entonces nada sucede cuando el usuario intenta cerrarla. Una aplicación que tenga una sóla ventana podría reaccionar a un evento window-closing saliendo del programa. Otros programas normalmente reaccionarán a los eventos window-closing eliminado la ventana o haciéndola invisible. Puedes ver Cómo crear Frames donde hay un ejemplo de un manejador de eventos window-closing.


Nota: Si utilizamos la clase JFrame de swing, podríamos no necesitar escribir un oyente de window. Puedes ver Cómo crear Frames para ma´s información sobre cómo la clase JFrame proporciona un manejo automático de los eventos window-closing.

Otros uso común de los oyentes de window es parar los threads y liberar recursos cuando una ventana es iconificada, y arracarlos otra vez cuando es desiconificada. De esta forma, podemos evitarel uso innecesario del procesador o de otros recursos. Por ejemplo, cuando una ventana que contiene una animación es iconificada, debería parar su thread de animación para liberar cualquier buffer. Cuando la ventana es desiconificada se puede arrancar el thread de nuevo y recrear los buffers.

Si queremos ser notificados cuando una ventana se hace visible o se oculta, deberíamos registrar un oyente de component sobre la ventana.

Métodos de evento Window

El interface WindowListener y su correspondiente clase adaptadora, WindowAdapter, conteniendo estos métodos:

void windowOpened(WindowEvent)
Llamado justos después de que la vetana escuchadas sea mostrada por primera vez.

void windowClosing(WindowEvent)
Llamada en respuesta a una petición de usuario de que la ventana escuchada sea cerrada. Para cerrar realmente la ventana, el oyente debería invocar a los métodos dispose o setVisible(false) de window.

void windowClosed(WindowEvent)
Llamado justo después de que la ventana escuchada sea cerrada.

void windowIconified(WindowEvent)
void windowDeiconified(WindowEvent)
Llamado justo después de que la ventana escuchada sea iconificada o desiconificada, respectivamente.

void windowActivated(WindowEvent)
void windowDeactivated(WindowEvent)
Llamado justo después de que la ventana escuchada sea activada o desactivada, respectivamente.

Ejemplos de manejo de eventos de Window

El siguiente applet desmuestra los eventos windows. Pulsando el botón del applet, podrás traer una pequeña ventana. La clase controladora escucha los eventos window de la ventana, mostrando un mensaje siempre que detecte uno. Puedes encontrar el código del applet en WindowEventDemo.java.

Pulsa esta imagen para ejecutar el applet.
Esta es una imagen del GUI del applet. Para ejecutar el applet, pulsa sobre ella. El applet aparecera en una nueva ventana del navegador..


Prueba esto:
  1. Trae la ventana Window Demo pulsando el botón de la parte superior del applet.
    La primera vez que pulses este botón, verás un mensaje "Window opened" en el área de display del applet.
  2. Pulsa sobre la ventana si todavía no tiene el foco.
    ¿Ves un mensaje "Window activated" en el área de display del applet?
  3. Iconiica la ventana, usando los controles de la propia ventana.
    Verás un mensaje "Window iconified" en el área de display del applet.
  4. Desiconifica la ventana.
    Verás un mensaje "Window deiconified" en el área de display del applet.
  5. Cierra la ventana, usando los controles de la ventana.
    Verás "Window closing" en el área de display del applet. Como el manejador de eventos llama a setVisible(false) en vez de dispose(), no verás "Window closed".

Aquí tienes el código de manejo de eventos del applet:

public class WindowEventDemo ... implements WindowListener {
     ...//where initialization occurs:
        //Create but don't show window.
        window = new JFrame("Window Event Window");
        window.addWindowListener(this);
        window.getContentPane().add(
	    new JLabel("The applet listens to this window for window events."),
	    BorderLayout.CENTER);
        window.pack();
    }

    public void windowClosing(WindowEvent e) {
        window.setVisible(false);
        displayMessage("Window closing", e);
    }

    public void windowClosed(WindowEvent e) {
        displayMessage("Window closed", e);
    }

    public void windowOpened(WindowEvent e) {
        displayMessage("Window opened", e);
    }

    public void windowIconified(WindowEvent e) {
        displayMessage("Window iconified", e);
    }

    public void windowDeiconified(WindowEvent e) {
        displayMessage("Window deiconified", e);
    }

    public void windowActivated(WindowEvent e) {
        displayMessage("Window activated", e);
    }

    public void windowDeactivated(WindowEvent e) {
        displayMessage("Window deactivated", e);
    }

    void displayMessage(String prefix, WindowEvent e) {
        display.append(prefix
                       + ": "
                       + e.getWindow()
                       + newline); 
    }
    ...
}
Aquí tienes algunos ficheros fuente que contienen oyentes de window:

La clase WindowEvent

Cada método de evento Window tiene un sólo parámetros: un objeto WindowEvent.
Window getWindow()
Devuelve la ventana que generó el evento. Podemos usarlo en lugar del método getSource.

Ozito