El Manejo de Eventos de Ventana puede ser útil en distintos aspectos. Permite crear software con funciones especificas. Supongamos que usted desea conectar una base de datos al momento de abrir la ventana por primera vez, podrá lograr este comportamiento gracias a los eventos de ventana.

Otro uso de los eventos de ventana, es en un programa de reloj. Este debe mostrar la hora al momento de iniciar por primera vez. Sin embargo, tan solo son algunas aplicaciones de este tipo de evento, pues seras capaz de crear software realmente interesante.

Debes saber que java ofrece una interfaz y clase adaptadora, en esta ocasión usaremos la interfaz. Primero comencemos creando nuestro método main encargado de crear y ejecutar las instancias.

package eventoventana;

import javax.swing.JFrame;

public class MainVentana {

    public static void main(String[] args) {
        Ventana ventana = new Ventana();
        ventana.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        ventana.addEventos(new OyenteVentana(ventana));
        ventana.setBounds(500, 200, 500, 400);
        ventana.setVisible(true);
    }
    
}

Ahora el siguiente paso es crear nuestra ventana y agregarle el evento. El código es:

package eventoventana;

import javax.swing.JFrame;

public class Ventana extends JFrame {
    
    public void addEventos(OyenteVentana oyente) {
        this.addWindowListener(oyente);
    }
    
}

El ultimo paso es crear nuestra clase que implemente la interfaz WindowListener. Sin embargo, antes mencionare el funcionamiento de cada método.

Descripción de los Métodos

windowActivated: Este método se activa cuando la ventana tiene el foco, con esto me refiero a cuando la ventana esta sobre todas las demás. Por ejemplo: cuando en windows tenemos dos ventanas abiertas, una estará con un color mas transparente (esto quiere decir que no estamos trabajando sobre esa ventana). Sin embargo, cuando la ventana tiene un color fijo es porque estamos trabajando (copiando, guardando o creando archivos) sobre esta.

windowDeactivated: Funciona de manera contraria al método anterior, cuando la ventana no esta activa (no tiene el foco o no se esta trabajando sobre esta) se invoca el método.

windowClosed: Se activa cuando la ventana se ha cerrado.

windowClosing: Cuando usted cierra la ventana presionando el botón de cerrar este método se activa. Por lo que, para aprovechar este método primero debe desactivar la función del botón cerrar. El código creado como ejemplo te mostrara como aprovechar esta función.

windowIconified: Al minimizar (ocultar) la ventana, esta función se invoca.

windowDeiconified: Lo contrario al método anterior, cuando la ventana se encuentra minimizada y es maximizada se invoca el método.

windowOpened: Es llamado cuando la ventana se ejecuta (abre) por primera vez.

Explicación del Ejemplo

El siguiente ejemplo te ayudara a comprender el funcionamiento de los métodos. Ademas, agregue una característica que podrá servirte en un futuro con el método windowClosing.

package eventoventana;

import java.awt.Color;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JOptionPane;

public class OyenteVentana implements WindowListener {
    
    private Ventana ventana;
    
    public OyenteVentana(Ventana ventana) {
        this.ventana = ventana;
    }

    @Override
    public void windowOpened(WindowEvent e) {
        JOptionPane.showMessageDialog(ventana, "Ventana iniciada por primera vez");
    }

    @Override
    public void windowClosing(WindowEvent e) {
        int opcion = JOptionPane.showConfirmDialog(ventana, "¿Quieres salir del programa?", "Salir", JOptionPane.YES_NO_OPTION);
        if(opcion==JOptionPane.YES_OPTION) {
            System.exit(0);
        }
    }

    @Override
    public void windowClosed(WindowEvent e) {
        System.out.println("La ventana se ha cerrado");
    }

    @Override
    public void windowIconified(WindowEvent e) {
        System.out.println("la ventana se a minimizado ");
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
        System.out.println("La ventana se a maximizado");
    }

    @Override
    public void windowActivated(WindowEvent e) {
        System.out.println("La ventana esta activa (tienes el foco)");
        ventana.getContentPane().setBackground(Color.RED);
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
        System.out.println("La ventana no esta activa (no tienes el foco)");
        ventana.getContentPane().setBackground(Color.BLACK);
    }
    
}

Explicare detenidamente como aprovechar windowClosing. Para lograr que el método funcione, primero debe desactivar la función del botón cerrar que ofrece la ventana. Esto podemos hacerlo con el siguiente código:

ventana.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

Con el código anterior le decimos que por mas que presionen el botón cerrar, la ventana no sera cerrada. Sin embargo, tras presionar el botón, se activa el método windowClosing (se lanza un evento). Dentro de este podemos poner cualquier código. Por ejemplo: preguntar si realmente desea salir de la ventana.

Ademas, cuando la ventana tiene el foco (La ventana esta sobre todas las demás) se activa windowActivated, dentro del método agregue el código necesario para cambiar el color de fondo a rojo. Podrá comprender de lo que hablo con la siguiente imagen:

Sin embargo, cuando usted no tiene el foco (la ventana esta detrás de otra) se invoca windowDeactivated y el color del fondo se cambia a negro.

Los demas metodos se comprenden de manera facil. Por lo que, no es necesario explicarlos, ademas olo imprimen un mensaje en consola.