Está en la página 1de 15

El modelo de eventos de Java

4/17/2002

El Modelo de Eventos de Java


Manejo de Eventos a partir de Java 1.1
Cada vez que el usuario teclea un carcter o pulsa un botn del ratn, ocurre un evento. Cualquier objeto puede ser notificado del evento. Todo lo que se tiene que hacer es implementar el interfase apropiado y ser registrado como un oyente de evento del evento fuente apropiado. Los componentes de AWT y Swing puede generar muchas clases de evento:
Accin que resulta en el evento El usuario pulsa un botn, presiona Return mientras teclea en un campo de texto, o elige un tem de men. El usuario elige un frame (ventana principal). El usuario pulsa un botn del ratn mientras el cursor est sobre un componente. El usuario mueve el cursor sobre un componente. El componente se hace visible. El componente obtiene obtiene el foco del teclado. Cambia la tabla o la seleccin de una lista. Tipo de oyente ActionListener WindowListener MouseListener MouseMotionListener ComponentListener FocusListener ListSelectionListener

Cada evento est representado por un objeto que ofrece informacin sobre el evento e identifica la fuente. Las fuentes de los eventos normalmente son componentes, pero otros tipos de objetos tambin pueden ser fuente de eventos. Como muestra la siguiente figura, cada fuente de evento puede tener varios oyentes registrados. Inversamente, un slo oyente puede registrarse con varias fuentes de eventos.
event event object /----> event listener source ---------------------------> event listener \----> event listener Descripcin: Mltiples oyentes pueden ser registrados para ser notificados de eventos de un tipo particular sobre una fuente particular. PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

17/04/2002

El Modelo de Eventos de Java


Cmo Implementar un Manejador de Eventos Todo manejador de eventos requiere tres partes de cdigo:
1. Donde se declare la clase del manejador de eventos, el cdigo especifica que la clase o implementa un interfase de oyente, o desciende una clase que implementa un interfase de oyente. Por ejemplo: public class MyClass implements ActionListener { El cdigo que registra una Instancia de la clase de manejo de eventos de un oyente sobre uno o ms componentes. Por ejemplo: someComponent.addActionListener(instanceOfMyClass); La implementacin de los mtodos del interfase oyente. Por ejemplo: public void actionPerformed(ActionEvent e) { ...//code that reacts to the action... }

2. 3.

Un escenario de manejo de eventos tpico ocurre con los botones (JButton). Para detectar cuando el usuario pulsa un botn de la pantalla (o pulsa la tecla equivalente), un programa debe tener un objeto que implementa el interfase ActionListener. El programa debe registrar este objeto como un oyente de accin del botn (la fuente del evento), usando el mtodo addActionListener. Cuando el usuario pulsa el botn de la pantalla, ste dispara el evento action, Esto resulta en una llamada al mtodo actionPerformed del oyente de action, el nico mtodo del interfase ActionListener). El nico argumento del mtodo es un objeto ActionEvent que ofrece informacin sobre el evento y su fuente.
ActionEvent button ----------------------------> action listener

Descripcin: Cuando el usuario pulsa un botn, los oyentes de action del botn son notificados.

Los manejadores de eventos pueden ser instancias de cualquier clase. Frecuentemente, se implementan usando clases internas annimas, lo que puede hacer el cdigo algo ms confuso -- hasta que hayas usado las clases internas. En el nuevo modelo de eventos cada elemento de la interfase grfica puede iniciar o disparar un evento representados por objetos. Estos eventos se capturan por interfaces que atienden y procesan el evento. De esta forma la fuente y el destino de los eventos quedan separados. Cada objeto que atiende a los eventos tiene una interfase especfica, estos objetos primero tienen que ser registrados mediante el mtodo addXXXListener( ) del componente que lanza los eventos, en esta interfase XXX representa el evento que se quiere lanzar. Por ejemplo:

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

El Modelo de Eventos de Java


Ejemplo :
//: Button2New.java // Capturing button presses import java.awt.*; import java.awt.event.*; // Must add this import java.applet.*; public class Button2New extends Applet { Button b1 = new Button("Button 1"), b2 = new Button("Button 2"); public void init() { b1.addActionListener(new B1()); b2.addActionListener(new B2()); add(b1); add(b2); } class B1 implements ActionListener { public void actionPerformed(ActionEvent e) { getAppletContext().showStatus("Button 1"); } } class B2 implements ActionListener { public void actionPerformed(ActionEvent e) { getAppletContext().showStatus("Button 2"); } } /* The old way: public boolean action(Event evt, Object arg) { if(evt.target.equals(b1)) getAppletContext().showStatus("Button 1"); else if(evt.target.equals(b2)) getAppletContext().showStatus("Button 2"); // Let the base class handle it: else return super.action(evt, arg); return true; // We've handled it here } */ } ///:~

Las clases B1 y B2 son clases internas que implementan solamente el interfase ActionListener que a su vez solo implementa el mtodo ActionPerformed().

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

El Modelo de Eventos de Java


Los Eventos y los Tipos de Oyentes
Todo el AWT y SWING se ha modificado para incluir el nuevo modelo de eventos, se han incluido las interfases addXXXListener() y removeXXXListener(), de esta forma se pueden aadir y quitar los mtodos de eventos para cada evento. El valor XXX tambin representa el argumento del mtodo, por ejemplo, addFooListener(FooListen er fl). En la siguiente pagina se muestra las tablas de equivalencia de eventos.

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

El Modelo de Eventos de Java

Como cada componente solo soporta un tipo especfico de evento la siguiente tabla lo resume:

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

El Modelo de Eventos de Java

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

El Modelo de Eventos de Java


La interfase de escucha se resume en esta tabla: Las interfases de escucha pueden ser tediosas ya que si tienen varios mtodos se tienen que implementar todos ( al ser una interfase ). En este caso se puede utilizar el xxxxAdapter que es una clase:
class MyWindowListener extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }

Entonces para cada oyente que tenga definidos varios mtodos existe una clase con los mismos mtodos que se puede utilizar mediante la herencia e implementar solamente aquellos mtodos de inters. A continuacin se vern varios ejemplos:

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

El Modelo de Eventos de Java


Aqu un applet que ilustra el manejo de eventos. Slo contiene un botn que pita cuando se pulsa sobre l.

Puedes encontrar el programa completo en Beeper.java. Aqu est el cdigo que implementa el manejo de eventos del botn:
public class Beeper ... implements ActionListener { ... //where initialization occurs: button.addActionListener(this); ... public void actionPerformed(ActionEvent e) { ...//Make a beep sound... } }

La clase Beeper implementa el interface ActionListener, que contiene un mtodo: actionPerformed. Como Beeper implementa ActionListener, un objeto Beeper puede registrar un oyente para los eventos action que genere el botn. Una vez que Beeper ha sido registrado usando el mtodo addActionListener de Button, cada que se pulse el botn se llamar al mtodo actionPerformed de Beeper.

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

El Modelo de Eventos de Java


Un ejemplo ms complejo El modelo de eventos, que hemos visto en su forma ms simple en el ejemplo anterior, es bastante poderoso y flexible. Cualquier nmero de objetos oyentes de eventos puede escuchar todas las clases de eventos desde cualquier nmero de objetos fuentes de eventos. Por ejemplo, un programa podra crear un oyente por cada objeto fuente. O un programa podra crear un slo oyente para todos los eventos para todas las fuentes. Incluso un programa puede tener ms de un oyente para una sola clase de evento de una sola fuente de eventos. El siguiente applet ofrece un ejemplo de uso de mltiples oyentes por objeto. El applet contiene dos fuentes de eventos (las instancias de JButton) y dos oyentes de eventos. Uno de los oyentes (una instancia de la clase llamada MultiListener) escucha los eventos de los dos botones. Cuando recibe un evento, aade el evento "action command" (el texto de la etiqueta del botn) en la parte superior del rea de texto. El segundo oyente (una instancia de la clase llamada Eavesdropper) escucha los eventos de uno de los botones. Cuando recibe un evento, aade el action command en la parte inferior del rea de texto. Puedes encontrar el programa completo en MultiListener.java. Aqu slo tenemos el cdigo que implementa el manejo de eventos de los botones:

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

10

El Modelo de Eventos de Java


public class MultiListener ... implements ActionListener { ... //where initialization occurs: button1.addActionListener(this); button2.addActionListener(this); button2.addActionListener(new Eavesdropper(bottomTextArea)); } public void actionPerformed(ActionEvent e) { topTextArea.append(e.getActionCommand() + newline); } } class Eavesdropper implements ActionListener { ... public void actionPerformed(ActionEvent e) { myTextArea.append(e.getActionCommand() + newline); } }

En el cdigo anterior, tanto MultiListener como Eavesdropper implementan el interface ActionListener y se registran cmo oyentes de action usando el mtodo addActionListener de JButton. Las implementaciones que ambas clases hacen del mtodo actionPerformed son similares: simplemente aaden el action command del evento al rea de texto.

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

11

El Modelo de Eventos de Java


Un Ejemplo de Manejo de Otro Tipo de Evento Hasta ahora, la nica clase de eventos que hemos visto son los eventos action. El siguiente programa maneja otros tipos de eventos: eventos del ratn. El applet muestra un rea rectangular y un rea de texto, cuando ocurre un evento del ratn -- una pulsacin, liberacin, entrar o salir -dentro del rea rectangular (BlankArea) o su contenedor (MouseEventDemo), el rea de texto mostrar una cadena describiendo el evento.

Puedes encontrar el programa completo en MouseEventDemo.java y BlankArea.java. Aqu slo tenemos el cdigo que implementa el manejo de eventos:

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

12

El Modelo de Eventos de Java


public class MouseEventDemo ... implements MouseListener { ... //where initialization occurs: //Register for mouse events on blankArea and applet blankArea.addMouseListener(this); addMouseListener(this); } public void mousePressed(MouseEvent e) { saySomething("Mouse pressed; # of clicks: " + e.getClickCount(), e); } public void mouseReleased(MouseEvent e) { saySomething("Mouse released; # of clicks: " + e.getClickCount(), e); } public void mouseEntered(MouseEvent e) { saySomething("Mouse entered", e); } public void mouseExited(MouseEvent e) { saySomething("Mouse exited", e); } public void mouseClicked(MouseEvent e) { saySomething("Mouse clicked (# of clicks: " + e.getClickCount() + ")", e); } void saySomething(String eventDescription, MouseEvent e) { textArea.append(eventDescription + " detected on " + e.getComponent().getClass().getName() + "." + newline); } }

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

13

El Modelo de Eventos de Java


El siguiente ejemplo implementa el mecanismo para que un programa de consola se ejecute tambin como un applet:
//: Button2NewB.java // An application and an applet import java.awt.*; import java.awt.event.*; // Must add this import java.applet.*; public class Button2NewB extends Applet { Button b1 = new Button("Button 1"), b2 = new Button("Button 2"); TextField t = new TextField(20); public void init() { b1.addActionListener(new B1()); b2.addActionListener(new B2()); add(b1); add(b2); add(t); } class B1 implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Button 1"); } } class B2 implements ActionListener { public void actionPerformed(ActionEvent e) { t.setText("Button 2"); } } // To close the application: static class WL extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } // A main() for the application: public static void main(String[] args) { Button2NewB applet = new Button2NewB(); Frame aFrame = new Frame("Button2NewB"); aFrame.addWindowListener(new WL()); aFrame.add(applet, BorderLayout.CENTER); aFrame.setSize(300,200); applet.init(); applet.start(); aFrame.setVisible(true); } } ///:~

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

14

El Modelo de Eventos de Java


Los Threads y el Manejo de Eventos
El cdigo de manejo de eventos se ejecuta en un slo thread el thread de despacho de eventos. Esto asegura que todo manejador de eventos se terminar de ejecutar antes de ejecutar otro. Por ejemplo, el mtodo actionPerformed del ejemplo anterior se ejecuta en el thread de manejo de eventos. El cdigo de dibujo tambin se realiza en el thread de despacho de eventos. Esto significa que mientras se est ejecutando el mtodo actionPerformed, el GUI del programa est congelado -- no se dibujar nada ni se responder a las pulsaciones del ratn. Importante: El cdigo de manejo de eventos se debera de ejecutar muy rpido! De otro modo, el rendimiento de tu programa se vera empobrecido. Si necesitas hacer una operacin de larga duracin, en respuesta a un evento, hazlo arrancando un nuevo thread (o de otro modo enviando una peticin a otro thread) para realizar el trabajo. En el captulo siguiente donde se presenta la librera JFC o Swing, se abordan los aspectos especficos sobre escribir los oyentes de eventos para los diferentes componentes grficos. En el estudio de los componentes JavaBeans se incluyen los aspectos especficos que afectan al comportamiento de estos componentes.

17/04/2002

PROFESOR: PROFESOR: Juan Juan Jos Jos Cabana Cabana Gonzlez Gonzlez (( juan.cabana@ieee.org juan.cabana@ieee.org ))

15

También podría gustarte