## 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.

> > 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