Tutorial de Java

Eventos Generados por el Usuario

Anterior | Siguiente
Hasta ahora se han descrito los eventos que pueden generar los Componentes que se integran en in interfaz gráfico. Ahora se va a abordar la creación y lanzamiento de eventos bajo el control del programa que se está ejecutando, que producirán las mismas respuestas que si los eventos tuviesen su origen en alguno de los Componentes del interfaz.

Aunque esta técnica no es imprescindible para entender el funcionamiento del Modelo de Delegación de Eventos, sí es un material crítico a la hora de entrar en el estudio de los componentes Lightweight, o componentes que no necesitan tener un soporte en la plataforma en que se ejecuta la aplicación, por lo que es necesario sentar sólidamente las bases del entendimiento de los eventos generados por programa para luego atacar el uso de los componentes Lightweight. Además, también esto servirá de mucho para entender más fácilmente lo que está sucediendo realmente cuando se implemente el Modelo de Delegación de Eventos utilizando componentes visuales desde el AWT.

Para poder utilizar los eventos generados por programa con las técnicas que se van a describir, será necesario definir una clase que sea capaz de generar este tipo de eventos. Aquí se centrará el estudio en los eventos de tipo Action, aunque no hay razón alguna para que la misma técnica se aplique a eventos de bajo nivel como puedan ser los eventos de ratón o del teclado.

La clase en cuestión debe ser una subclase de Component y, al menos, debe incluir los siguientes tres miembros:

  • Una variable de instancia que es una referencia a la lista de objetos Listener registrados. En el ejemplo siguiente, java1111.java, estos objetos receptores de eventos son de tipo ActionListener. La variable de instancia es de tipo ActionListener y puede contener una referencia a un solo objeto de este tipo o una referencia a una lista de objetos de este tipo.
  • Un método para crear la lista anterior, que en el ejemplo es generaListaReceptores(), que se llama a sí para ilustrar que el nombre no es técnicamente importante, aunque por consistencia con la documentación del Modelo de Delegación de Eventos, debiera llamarse addActionListener(). Esta lista ha de ser generada a través de una llamada al método AWTEventMulticaster.add(), que devuelve una referencia a la lista.
  • Un método que invocará al método correspondiente al tipo de evento en la clase Listener de la lista de objetos receptores de los eventos. En el ejemplo, los objetos receptores son de tipo ActionListener, así que el método en cuestión es actionPerformed(), y el método que lo invoca es generaEventoAction(). En este ejemplo solamente hay un objeto receptor, luego se verá otro en el que habrá varios objetos receptores de este tipo de eventos en la lista.

En el programa java1111.java, se instancia un solo objeto de la clase NoVisualizable. También se define un solo objeto de la clase ActionListener, que es instanciado y registrado para recibir objetos de tipo Action generados sobre el objeto NoVisualizable.

La generación del evento Action se produce al invocar el método generaEventoAction() del objeto de la clase NoVisualizable. Este evento es atrapado y procesado por el objeto ActionListener, y como resultado del procesado aparecerá en pantalla la información siguiente:

% java java1111
Tutorial de Java, Eventos
metodo actionPerformed() invocado sobre ObjetoNoVisual

El listado del código completo de este ejemplo es el que se reproduce a continuación.

Es interesante repasar un poco más detalladamente el funcionamiento del programa y el código que lo implementa. Y, empezando por el constructor, se observa que instancia un objeto del tipo NoVisualizable, registra un objeto receptor de eventos sobre ese objeto NoVisualizable e invoca al método que hace que el objeto NoVisualizable genere un evento de tipo Action. Todo esto se hace en las líneas siguientes:

NoVisualizable objNoVisual = new NoVisualizable( "ObjetoNoVisual" );
objNoVisual.generaListaReceptores( new ClaseActionListener() );
objNoVisual.generaEventoAction();

La siguiente sentencia es la declaración de la variable de instancia en la definición de la clase NoVisualizable que referenciará la lista de objetos Listener registrados, que como ya se ha indicado puede apuntar a uno o a varios objetos de tipo ActionListener.

ActionListener receptorAction;

En la línea de código que se reproduce a continuación se encuentra la sentencia que construye la lista de objetos Listener registrados añadiendo un nuevo objeto a esa lista. La primera vez que se ejecuta la sentencia en el programa, devuelve una referencia al objeto que se añade. Cuando se ejecute posteriormente, devolverá una referencia a la lista de objetos que está siendo mantenida separadamente.

receptorAction = AWTEventMulticaster.add( receptorAction,listener ); 

En este caso, solamente se añade un objeto a la lista y si se examina la referencia que devuelve el método add() se observará que es la referencia a un solo objeto.

La última sentencia interesante de este ejemplo es la invocación del método actionPerformed() del objeto ActionListener, o más propiamente, la invocación de este método en todos los objetos que se encuentren registrados en la lista. Afortunadamente, todo lo que hay que hacer es invocar el método sobre la referencia y el sistema se encarga de realizar la invocación en cada uno de los objetos que están integrados en la lista. Esta es la característica principal de la clase AWTEventMulticaster.

receptorAction.actionPerformed( new ActionEvent( this,ActionEvent.ACTION_PERFORMED,ID ) );

Y a esto es a lo que se reduce, en esencia, la generación de eventos desde programa. Aunque se puede complicar todo lo complicable, como se muestra en el ejemplo siguiente, java1112.java, que ya tiene un poco más de consistencia y está destinado a ilustrar la capacidad de la clase AWTEventMulticaster de despachar eventos a más de un objeto a la vez, en concreto a todos los que se encuentren registrados en la lista de objetos Listener.

En este ejemplo se registran dos objetos diferentes ActionListener sobre un solo objeto NoVisualizable, con lo cual la clase AWTEventMulticaster deberá lanzar eventos Action a dos objetos Listener distintos. El código del ejemplo es el que se muestra a continuación y le sigue un repaso detallado de las sentencias de código que resultan más interesantes.

La mayor parte del código del ejemplo son simples sentencias de impresión de información por pantalla, para explicar qué es lo que está sucediendo durante la ejecución del programa, así que solamente se revisará a continuación las sentencias que resultan interesantes para comprender el funcionamiento y utilización de la clase AWTEventMulticaster.

Navegador

Home | Anterior | Siguiente | Indice | Correo