Cómo escribir un Oyente de Component

Un objeto Component genera uno o más eventos componente justo después de que el componente haya sido ocultado, hecho visible, movido o redimensionado. Un ejemplo de oyente de component podría estar en una herramienta de construcción de GUI que muestra información sobre el tamaño del componente seleccionado, y que necesita saber cuando cambia el tamaño del componente. Normalmente no se necesita manejar eventos componente para controlar la distribución básica ni el redibujado.

Los eventos component-hidden y component-visible sólo ocurren como resultados de llamadas al método setVisible de Component. Por ejmplo, una ventana podría ser miniaturizada en un icono iconificada) sin que se generará ningún evento component-hidden.

Métodos de Evento Component

El interface ComponentListener y su correspondiente clase adpatador ComponentAdapter, contienen cuatro métodos:
void componentHidden(ComponentEvent)
Se le llama después de ocultar el componente esuchado como resultado de una llamada al método setVisible.

void componentMoved(ComponentEvent)
Se le llama cuando el componente escuchado se mueve en relación a su contenedor. Por ejemplo, si se mueve una ventana, genera un evento component-moved, pero el componente que la contiene no lo genera.

void componentResized(ComponentEvent)
Se le llama después de que cambie el tamaño del componente escuchado.

void componentShown(ComponentEvent)
Se le llama después de que componente escuchado se vuelva visible como resultado de una llamada al método setVisible.

Ejemplos de Manejo de Eventos Component

El siguiente applet demuestra los eventos component. El applet contiene un botón que trae una ventana (JFrame). La ventana contiene un panel que tiene una etiqueta y un checkbox. El checkbox controla si la etiqueta es visible. Cuando abandonamos la página del applet, la ventana desaparece, y reaparece cuando volvemos a la página del applet. El área de texto muestra un mensaje cada vez que la ventana, el panel, la etiqueta o el checkbox generan un evento component.

Click this figure to run the applet.
Esta es una imagen del GUI del applet. Para ejecutarlo, pulsa sobre ella. El applet aparecerá en una nueva ventana de tu navegador.

Prueba esto:
  1. Pulsa el botón llamado "Start playing...".
    La ventana se desplegará, generando uno o más eventos component-shown y component-moved.
  2. Pulsa el checkbox para ocultar la etiqueta.
    La etiqueta genera un evento component-hidden.
  3. Pulsa de nuevo el checkbox para mostrar la etiqueta.
    La etiqueta genera un evento component-shown.
  4. Minimiza y maxima la ventana que contiene la etiqueta.
    No se obtienen eventos component-hidden ni component-shown. Si queremos ser informados de los eventos de iconificación deberíamos usar un oyente de window.
  5. Cambia el tamaño de la ventana que contiene la etiqueta.
    Veremos los eventos component-resized (y posiblemente) de los cuatro componentes - etiqueta, checkbox, panel y ventana. Si la controlador de distribución de la ventana y el panel no hacen que cada componente sean tan anchos como sea posible, el panel, la etiqueta y el checkbox podrían no haber sido redimensionados.

El código del applet los puedes encontrar en ComponentEventDemo.java. Aquí puedes ver sólo el código relacionado con el manejo de eventos component:

public class ComponentEventDemo ... implements ComponentListener {
    ...
    //where initialization occurs:
        aFrame = new JFrame("A Frame");
        ComponentPanel p = new ComponentPanel(this);
        aFrame.addComponentListener(this);
        p.addComponentListener(this);
    ...

    public void componentHidden(ComponentEvent e) {
	displayMessage("componentHidden event from "
		       + e.getComponent().getClass().getName());
    }

    public void componentMoved(ComponentEvent e) {
	displayMessage("componentMoved event from "
		       + e.getComponent().getClass().getName());
    }

    public void componentResized(ComponentEvent e) {
	displayMessage("componentResized event from "
		       + e.getComponent().getClass().getName());
    }

    public void componentShown(ComponentEvent e) {
	displayMessage("componentShown event from "
		       + e.getComponent().getClass().getName());
    }
}


class ComponentPanel extends JPanel ... {
    ...
    ComponentPanel(ComponentEventDemo listener) {
        ...//after creating the label and checkbox:
        label.addComponentListener(listener);
        checkbox.addComponentListener(listener);
    }
    ...
}

La clase ComponentEvent

Cada método de evento Component tiene un sólo parámetro, un objeto ComponentEvent. La clase ComponentEvent define los siguientes métodos muy útiles:
Component getComponent()
Devuelve el componente que generó el evento. Podemos utilizarlo en lugar del método getSource.

Ozito