Académique Documents
Professionnel Documents
Culture Documents
Fuentes de eventos.
Una fuente es un objeto que genera un evento y sucede cuando el estado de dicho objeto es
modificado. Las fuentes pueden generar más de un tipo de eventos. Cada fuente tiene que registrar
los listeners para que reciban notificaciones sobre un tipo específico. Cada tipo de evento tiene su
propio método de registro pero la forma general es:
Donde Type es el nombre del evento y ol es una referencia al listener por ejemplo addKeyListener.
Algunas fuentes solo permiten registrar a un listener. La forma general es
addTypeListener(TypeListener ol) throws java.util.TooManyListenersException. Esto es conocido
como difusión única del evento.
A continuación se listan algunos de los componentes de interfaz de usuario que pueden generar los
eventos descritos en el documento anterior. Además de esos elementos de GUI, cualquier clase
derivada de Component puede generar eventos.
Clases adaptadoras
Proporciona una implementación vacía de todos los métodos en una interfaz listener de evento y son
útiles cuando se quiere recibir y procesar sólo alguno de los eventos que está gestionando una
interfaz listener de eventos en particular. Por ejemplo, la clase MouseMotionAdapter tiene dos
métodos, mouseDragged( ) y mouseMoved( ) los cuales son métodos definidos por la interfaz
MouseMotionListener. Si sólo estamos interesados en eventos de arrastre de ratón, se puede
simplemente extender MouseMotionAdapter y sobrescribir mouseDragged( ).
Tomemos como ejemplo la siguiente ventana
Cuando un usuario interactúa con el applet, el sistema Java crea una instancia de la clase Event, y
rellena sus datos miembro con la información necesaria para describir la acción. Es en ese momento
cuando el sistema Java permite al applet controlar el evento. Este control comienza por el
Componente que recibe inicialmente el evento (por ejemplo, el botón que ha sido pulsado) y se
desplaza hacia arriba en el árbol de Componentes, componente a componente, hasta que alcanza al
Contenedor de la raíz del árbol. Durante este camino, cada Componente tiene oportunidad de
ignorar el evento o reaccionar ante él en una (o más) de las formas siguientes:
Veamos la descripción de una acción con el applet de la figura anterior. El usuario pulsa el botón
"Uno". El sistema runtime del lenguaje Java capturará la información sobre el evento (el número de
clics, la localización del clic, la hora en que se ha producido la pulsación y el Componente que ha
recibido el clic) y empaqueta todos esos datos en una instancia de la clase Event. El sistema Java
comienza entonces por el Componente que ha sido pulsado (en este caso, el botón "Uno") y, a
través de una llamada al método handleEvent() del Componente, ofrece a éste la posibilidad de
reaccionar ante el evento. Si el Componente no controla el evento, o no lo hace completamente
(indicado por un valor de retorno false), el sistema Java presentará la instancia de Event al siguiente
Componente por encima en el árbol (en este caso, una instancia de la clase Panel). El sistema Java
continúa de este mismo modo hasta que el evento es controlado en su totalidad o ya no hay
Componentes a los que informar. En la figura siguiente mostramos el camino recorrido por el evento
en su intento de que algún Componente lo controle.
Cada Componente del applet añade una línea al objeto TextArea indicando que ha recibido un
evento. Luego permite que el evento se propague al siguiente Componente.
El código del controlador de eventos usado en el ejemplo es el que muestran las siguientes líneas:
A continuación se muestra cómo se puede mejorar el programa anterior utilizando una clase interna.
Aquí, InnerClassDemo es una clase de nivel superior que extiende a Applet.
MyMouseAdapter es una clase interna que extiende a MouseAdapter. Puesto que se define a
MyMouseAdapter dentro del ámbito de InnerClassDemo, tiene acceso a todos los métodos y
variables dentro del ámbito de esa clase. Por lo tanto, el método mousePressed( ) puede llamar
directamente al método showStatus( ). Al hacer esto, ya no se necesita guardar referencia alguna al
applet. Es decir, ya no es necesario que MyMouseAdapter( ) pase una referencia al objeto invocado.