Escribir un Oyente de Component

Uno o más eventos de Component son generados por un objeto Component justo despues de que el componente se haya ocultado, se haya movido, hecho visible o redimensionado. Un ejemplo de un oyente de Component podría ser una herramienta de construcción de GUI que mostrara información sobre el tamaño del componente seleccionado, y que necesite conocer cuando cambia el tamaño del componente. Necesitarías utilizar eventos de componente para manejar la disposición y manejo básico.

Los eventos de componente oculto y componente visible ocurren sólo como resultados de llamadas al método setVisible de Component (o sus equivalentes show y hide). Por ejemplo, una ventana podría ser miniaturizada en un icoco (iconificada) sin que se haya generado un evento de componente oculto.

Métodos de Evento de Component

El interface ComponentListener y su clase adaptador correspondiente, ComponentAdapter, contienen cuatro métodos:
void componentHidden(ComponentEvent)
Llamado por el AWT después de que el componete este oculto como resultado de una llamada al método setVisible.

void componentMoved(ComponentEvent)
Llamado por el AWT después de que el componente se haya movido, relativo a su contenedor. Por ejemplo, si una ventana se mueve, esta ventana genera un evento de componente movido, paro el componente que la contiene no.

void componentResized(ComponentEvent)
Llamado por el AWT después de quel componente haya cambiado su tamaño.

void componentShown(ComponentEvent)
Llamado por el AWT después de que el componente se vuelva visible como resultado de una llamada al método setVisible.

Ejemplos de manejo de eventos de Component

El siguiente applet demuestra los eventos de componente. El applet trae una ventana (Frame) que contiene una etiqueta y un checkbox. El checkbox controla si la etiqueta es visible o no. Siempre que el applet arranca (como cuando visitas o revisitas la página que contiene el applet), la ventana se hace visible. Siempre que el applet se para (cuando dejas la página que contiene al applet), esta ventana se oculta. Un área de texto muestra un mensaje cada vez que la ventana, la etiqueta o el checkbox generan un evento de componente.


Intenta esto:
  1. Pulsa sobre el checkbox para ocultar la etiqueta.
    La etiqueta genera un evento de componente oculto.
  2. Pulsa de nuevo sobre el checkbox para mostrar la etiqueta.
    La etiqueta genera un evento de componente visible.
  3. Iconifica y des-iconifica la ventana llamada "SomeFrame".
    No se obtiene ningún evento de componnte oculto o visible.
  4. Cambia el tamaño de la ventana "SomeFrame".
    Verás el evento de componente redimensionado (y posiblemente el de componente movido) para los tres componentes -- etiqueta, checkbox y ventana. Si el manejador de distribución de la ventana no hace cada componente tan ancho como sea posible, la etiqueta y el checkbox no se habrán redimensionado.

Puedes encontrar el código del applet en ComponentDemo.java. Aquí tienes el código de manejo de eventos Component del applet:

public class ComponentDemo ... implements ComponentListener {
    ...
    //Donde ocurra la inicialización:
	someFrame = new SomeFrame(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 SomeFrame extends Frame ... {
    ...
    SomeFrame(ComponentListener listener) {
	...
	label.addComponentListener(listener);
	checkbox.addComponentListener(listener);
	this.addComponentListener(listener);
	...
    }
    ...
}

La clase ComponentEvent

Cada método de evento de Component tiene un sólo parámetro, un objeto ComponentEvent. La clase ComponentEvent define un método útil, getComponent, que devuelve el Componente que generó el evento.


Ozito