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