Está en la página 1de 42

La gestin de eventos 10 - 1

CAPITULO

10

La gestin de eventos
Objetivos:
Explicar la manera como Java maneja los eventos Identificar los diferentes tipos de eventos y sus clase manejadoras. Desarrollar programas que manejen diversos tipos de eventos. Utilizar algunos componentes Swing para manejo de sus eventos

Presentacin
La mayora de programas actuales se relacionan con los usuarios a travs de lo que se denomina como Interfaz Grfica de Usuario (Graphical User Interface GUI por su sigla en Ingls), la cual se puede componer de ventanas, botones, mens, barras de desplazamiento, areas de texto, conos e imgenes, y otros componentes grficos visualizados en la pantalla, y que fundamentalmente intermedian entre el ususario y el sistema (hardware y software), para llevar a cabo procesos de interaccin de entrada y salida de informacin. Se entiende por componente grfico un objeto que tiene una representacin grfica deplegable en la pantalla y que dentro de sus mtodos se encuentra la posibilidad de interactuar con el usuario (que puede ser otro objeto). Como ya se ha indicado antes, los programas tipo applet se basan en eventos, los cuales en su mayora tienen que ver interacciones del usuario. Una interaccin del usuario se pasa al applet y se trata de acuerdo al mtodo encargado de manejar el tipo de evento determinado, generado por el usuario;

La gestin de eventos : Presentacin 10 - 2 por ejemplo, minimizar o restaurar una ventana, presionar un objeto botn (JButton) en la ventana del applet, presionar el raton, presionar una tecla en el teclado y otros, generan eventos. El xito del desarrollo creativo de una aplicacin o applet se fundamenta en el manejo de eventos. El paquete java.awt y java.awt.event contienen las clases e interfaces para escribir programas que utilizan interfaz grfica (GUI). Un objeto del tipo JTextField, por ejemplo, representa un componente de texto que al darse enter en el campo de texto por parte del usuario, se genera un evento que activa la realizacin de una accion determinada, por ejemplo borrar el contenido del texto del objeto JTextField. El manejo de eventos involucra, por tanto, mtodos que se llaman de manera automtica cada vez que el usuario realiza un evento o accin sobre un componente determinado. Se puede afirmar en forma general que, un evento es un cambio de estado de un objeto, por tanto se generan eventos de manera interna entre objetos. Aqu se tratar de eventos generados en la interaccion entre usuario y los objetos de la interfaz grfica o GUI. Se presentar el manejo de eventos implementados a partir de la versin JDK1.2 y usando los componentes Swing. Aunque este manejo de eventos tambien es aplicable a los componentes AWT, se presentan aqu las versiones bajo Swing, por cuanto son mas modernas y obviamente mas atractivo su uso e implementacin.

Eventos
Un evento se genera como respuesta a lo que el usuario realice como interaccin con un programa durante el ciclo de vida de este, sea una aplicacin o applet. Como todo en Java, los eventos son representados como objetos, habiendo diferentes tipos de eventos, representado cada uno por una clase diferente. Todas las clases de eventos son subclases de la clase abstracta
java.awt.AWTevent, entre las cuales se tiene: ActionEvent, AdjustmentEvent, AncestorEvent, ComponentEvent, HierarchyEvent, InputMethodEvent, InternalFrameEvent, InvocationEvent, ItemEvent, TextEvent

Otras clases de eventos que representen tipos particulares por ejemplo MouseEvent y ActionEvent, se encuentran en el paquete java.awt.event:

La gestin de eventos : Eventos 10 - 3


ActionEvent, AdjustmentEvent, AWTEventListenerProxy, ComponentAdapter, ComponentEvent, ContainerAdapter, ContainerEvent, FocusAdapter, FocusEvent, HierarchyBoundsAdapter, HierarchyEvent, InputEvent, InputMethodEvent, InvocationEven, ItemEvent, KeyAdapter, KeyEvent, MouseAdapter, MouseEvent, MouseMotionAdapter, MouseWheelEvent, PaintEvent, TextEvent, WindowAdapter, WindowEvent.

Las interfaces en el mismo paquete son:


ActionListener AdjustmentListener AWTEventListener ComponentListener ContainerListener FocusListener HierarchyBoundsListener HierarchyListener InputMethodListener ItemListener KeyListener MouseListener MouseMotionListener MouseWheelListener TextListener WindowFocusListener WindowListener WindowStateListener

En el diseo de un programa se debe prestar atencion solo a los ventos que se desea el programa responda, o que interactuen con el usuario. Los siguientes son algunos de los eventos que se pueden manejar en un programa Java:

Clics del raton: ratn abajo cuando se presiona el boton, raton arriba cuando se libera el boton y clic del raton cuando se oprime y suelta en el mismo lugar. Movimientos del raton: Entrada o salida del sealizador del raton de un componente o area de la ventana, o arrastre del raton, cuando se mueve el sealizador con el boton presionado. Teclas: la presin de una tecla, la liberacion de una tecla y la digitacin de una tecla o sea la secuencia de presionar y liberar. Eventos de la interfaz del usuario: componente boton presionado, movimiento de barras de desplazamiento, activacin de menus contextuales y otros.

Para que un evento tenga efecto, el programa debe estar en capacidad de detectarlo (escucharlo) y reaccionar ante el (realizar alguna accion). Para cada clase de evento, hay una clase del tipo interface que define uno o mas mtodos para reaccionar a los eventos generados de esa clase. Por ejemplo, asociado con la clase ActionEvent se tiene la interface denominada ActionListener, la cual define un mtodo

La gestin de eventos : Eventos 10 - 4


public void actionPerformed(ActionEvent).

Una clase que desee responder a eventos del objeto dado debe implementar, por consiguiente, la interfaz ActionListener. Este es el caso del manejo del objeto JTextField. Debe recordarse que, al ser una interfaz una clase donde los mtodos estn declarados pero no implementados, la clase que requiera ese escucha para alguno de sus componentes, deber implementar todos los mtodos declarados. En el caso de ActionListener, solo hay que implementar el mtodo actionPerformed().

Modelo para manejo de eventos


El modelo de manejo de ventos en la versin actual de Java, se denomina de Delegacin de Eventos, el cual para controlar los eventos en un programa, especifica que se le indique cuales eventos son los que se desea monitorear o escuchar, as como tambin, especificar las acciones de respuesta a estos. El modelo de delegacion de ventos se fundamenta en la organizacin de los eventos en una jerarqua de Clases de eventos. Un evento es un objeto o instancia de una clase de evento.En este modelo se hace uso de fuentes de eventos transmitidos (o ejecutados) por sus orgenes (Source) y manejados por escuchas o receptores de eventos (Listener). La clase EventObject del paquete java.util es la superclase de todos los eventos en el modelo de delegacin de eventos. Entre estos se encuentran KeyEvent, MouseEvent, ActionEvent y otros como subclases de java.awt.AWTEvent.

Una fuente de eventos es cualquier objeto capaz de detectar eventos y notificar a los escuchas de los eventos que se generen. Un receptor de eventos es una clase o subclase, que implementa una interfaz con recepcin especifica de eventos.Existe un conjunto de clases receptoras o escuchas, con lo mtodos adecuados para el tratamiento de los eventos de su clase. La invocacin de estos mtodos es el mecanismo mediante el cual el objeto fuente notifica al receptor que uno o ms eventos ha sucedido. El fuente mantiene una lista de objetos receptores de eventos y los tipos de eventos a los cuales est suscrito. El objeto receptor es una instancia de una clase que implementa la interfaz EventListener heredada desde el receptor genrico java.util.EventListener.

La gestin de eventos : Modelo para manejo de eventos 10 - 5 La lista de objetos receptores as como los tipos de eventos a los que estn suscritos, es creada en el objeto fuente mediante llamadas a los mtodos cuya forma general es,
add<TipoEvento>Listener()

por ejemplo addMouseListener(), para agregar un escucha de las operaciones del mouse.
.... Jbutton miBoton= new Jbutton(Boton01); miBoton.addMouseListener(this);

Permite registrar eventos del ratn asociados con el objeto miBoton. Esto se denomina Registro de Receptorres especficos para la recepcin de eventos. El objeto fuente utiliza esta lista para notificar a cada receptor que ha sucedido un evento de los que controla. Hay algunas clases de eventos que involucran a mas de un evento, tal es el caso del ratn. Por tanto, la clase que implementa la interfaz del ratn debe sobreescribir todos los mtodos declarados en la interfaz, tales como mousePressed, mouseReleased, mouseClcked, mouseMoved y otros. Esto hace un codigo innecesariamente extendido, si solo se requiere controlar un tipo de evento, port ejemplo, mousePressed. Para facilitar el manejo de estos eventos, se han definido un nmero de clases intermedias, conocidas como clases adaptadores (Adapters), para no tener que sobreescribir todos los mtodos de la interfaz. Su mecanismo es implementar la interfaz receptora, sobreescribiendo todos los mtodos de la interfaz como vacos. As una clase receptora puede definirse como una clase que extiende una clase Adapter, en lugar de implementar una interfaz, sobreescribiendose nicamente los mtodos que sean de interes monitorear. A este punto tenemos dos caminos para acceder a los escuchas de los eventos para un componente especfico:

implementando la interfaz, lo cual implica sobreescribir todos sus mtodos. Extendiendo una clase adaptadora, con lo cual se sobreescriben solo los mtodos deseados.

La gestin de eventos : Modelo para manejo de eventos 10 - 6 Por ejemplo si un applet se desea que responda con un mensaje a eventos de un objeto de la clase Button debe tener la siguiente forma:

import import import import

java.awt.*; java.awt.event.*; java.applet.*; javax.swing.*;

public class MiApplet extends JApplet implements ActionListener{ String msg = " "; int nVeces =0; JButton miBoton; // componente public void init (){// inicializa el applet miBoton = new JButton("Boton 01"); miBoton.addActionListener(this); getContentPane().add(miBoton); } // para responder a los eventos del boton public void actionPerformed(ActionEvent evento){ nVeces++; showStatus("ha pulsado el boton "+nVeces+" veces"); } }

Que da como resultado despues de presionar el boton un numero de veces como se ilustra en las figuras mas adelante.

Implementando la interfaz ActionListener, un objeto es capaz de escuchar eventos action. Pero antes de que pueda escuchar cualquier evento, este debe ser registrado como un escuchador de action, ActionListener. Cuando el usuario da un click en el ratn, un evento action se genera. Cada componente que pueda generar eventos action, debe tener un mtodo llamado addActionListener. Este mtodo es usado para registrar los escuchas de eventos de action con el componente. Cuando el componente genera un evento de action, notifica al escucha de action registrado llamando el mtodo actionPerformed().

La gestin de eventos : Modelo para manejo de eventos 10 - 7

En el ejemplo anterior se crea un componente miBoton del tipo JButton , para lo cual se utiliza el mtodo init() del applet. Cuando se da click en el raton, el applet llama al mtodo, miBoton.addActionListener(this).La notificacin es enviada al applet, mediante el llamado al mtodo actionPerformed(). Cuando este mtodo es llamado se le pasa un parmetro del tipo ActionEvent. Este parmetro contiene informacin acerca del evento en particular que se ha generado, ya que cada evento es representado por una clase diferente debido a que cada tipo de evento requiere diferente informacin para ser enviada a sus escuchas. Una vez se le d control al mtodo actionPerformed, se asigna un valor a la cadena msg, la cual tena asignado , se invoca al mtodo repaint() del applet, el cual invoca luego a paint(), donde se dibuja el mensaje, En la raiz de la jerarqua de eventos se encuentra EventObject que se encuentra en java.util. Contiene dos mtodos se pueden utilizar para acceder a informacin sobre eventos:
Object getSource(): retorna la fuente del evento, permitiendo con este

mtodo identificar el objeto que ha generado el evento. La siguiente instruccin, que debe ir dentro del cuerpo del mtodo actionPerformed(), ilustra la utilizacin de este mtodo para establecer si se ha generado un evento por el

La gestin de eventos : Modelo para manejo de eventos 10 - 8 objeto miBoton.


if(evento.getSource()==miBoton) ...

la expresin dentro del if ser verdadera si el evento ha sido generado por el objeto miBoton. Un evento se lo representa mediante un objeto tipo evento que tiene tanto los atributos y los mtodos para trabajar con el. Los datos de un objeto evento se pueden acceder y establecer por medio de los mtodos.

La clase AWEvent
Los mtodos de una interfaz escucha de eventos del AWT tienen un solo argumento, que es una instancia de una clase que desciende de la clase java.awt.AWTEvent. Esta clase hereda un mtodo muy til de la clase java.util.EventObject,
Object getSource(Action evento)

el cual se encarga de devolver el objeto que gener el evento, por ejemplo en el siguiente programa para conocer cual es el boton que se ha presionado en el mtodo actionPerformed(Action event): Las siguientes figuras ilustran la interfaz, desde el inicio hasta la presion de un boton cualquiera y exhibir algun mensaje dibujado en la ventana del applet.

La gestin de eventos : La clase AWEvent 10 - 9

import java.awt.*; import java.awt.event.*; import java.applet.*; public class Botones01 extends Applet implements ActionListener

{
String msg = " ";

Button botonSi,botonNo,botonOtro;
public void init (){ botonSi = new Button("si"); botonSi.addActionListener(this); botonNo = new Button("no"); botonNo.addActionListener(this); botonOtro = new Button("otro"); botonOtro.addActionListener(this);

add(botonSi); add(botonNo); add(botonOtro); }


public void actionPerformed(ActionEvent evento){ if(evento.getSource()== botonSi) msg = ("ha pulsado el boton si"); else if(evento.getSource()==botonNo) msg = "ha pulsado el boton no"; else if(evento.getSource()==botonOtro) msg = "ha pulsado boton otro";

repaint(); }
public void paint(Graphics g){

g.drawString(msg,6,100); } }

Un ejemplo mas elaborado lo consituye el siguiente ejemplo el cual consiste en un tablero de jugar triqui. Cada jugador marca una posicin en un tablero de tres por tres. Gana el jugador que logre colocar tres posiciones en linea a su

La gestin de eventos : La clase AWEvent 10 - 10 favor. Por ejemplo un jugador las coloca de color rojo y el otro de color azul. La figura muestra la interfaz para este juego.

La siguiente figura ilustra el estado del tablero despues de cuatro jugadas. Observese el mensaje en la linea de estado, acerca del ultimo boton presionado.

La gestin de eventos : La clase AWEvent 10 - 11 El siguiente es el cdigo del applet Triqui01:


import java.awt.event.*; import java.awt.*; import javax.swing.*; import java.applet.*; public class Triqui01 extends JApplet implements ActionListener { int turno = -1; JButton jButton11; JButton jButton12; JButton jButton13; JButton jButton14; JButton jButton15; JButton jButton16; JButton jButton17; JButton jButton18; JButton jButton19; public Triqui01() { jButton11 = new JButton(); jButton12 = new JButton(); jButton13 = new JButton(); jButton14 = new JButton(); jButton15 = new JButton(); jButton16 = new JButton(); jButton17 = new JButton(); jButton18 = new JButton(); jButton19 = new JButton(); GridLayout miLayout= new GridLayout(3,3); getContentPane().setLayout(miLayout); jButton11.setText("jButton11"); jButton11.addActionListener(this); getContentPane().add(jButton11); jButton12.setText("jButton12"); jButton12.addActionListener(this); getContentPane().add(jButton12); jButton13.setText("jButton13"); jButton13.addActionListener(this); getContentPane().add(jButton13); jButton14.setText("jButton14"); jButton14.addActionListener(this); getContentPane().add(jButton14);

La gestin de eventos : La clase AWEvent 10 - 12


jButton15.setText("jButton15"); jButton15.addActionListener(this); getContentPane().add(jButton15); jButton16.setText("jButton16"); jButton16.addActionListener(this); getContentPane().add(jButton16); jButton17.setText("jButton17"); jButton17.addActionListener(this); getContentPane().add(jButton17); jButton18.setText("jButton18"); jButton18.addActionListener(this); getContentPane().add(jButton18); jButton19.setText("jButton19"); jButton19.addActionListener(this); getContentPane().add(jButton19); } public void actionPerformed(ActionEvent evt) { if(evt.getSource()==jButton19){ if (turno == -1){ jButton19.setBackground(Color.red); turno=-turno;} else{ jButton19.setBackground(Color.blue); turno=-turno;} // Add your handling code here: jButton19.setEnabled(false); showStatus("presiono jButton19");} if(evt.getSource()==jButton18){ if (turno == -1){ jButton18.setBackground (Color.red); turno=-turno;} else{ jButton18.setBackground(Color.blue); turno=-turno;} jButton18.setEnabled(false); showStatus("presiono jButton18");} if(evt.getSource()==jButton17){ if (turno == -1){ jButton17.setBackground (Color.red); turno=-turno;} else{ jButton17.setBackground(Color.blue); turno=-turno;} jButton17.setEnabled(false); showStatus("presiono jButton17");} if(evt.getSource()==jButton16){ if (turno == -1){ jButton16.setBackground (Color.red); turno=-turno;} else{ jButton16.setBackground(Color.blue);

La gestin de eventos : La clase AWEvent 10 - 13


turno=-turno;} jButton16.setEnabled(false); showStatus("presiono jButton16");} if(evt.getSource()==jButton15){ if (turno == -1){ jButton15.setBackground (Color.red); turno=-turno;} else{ jButton15.setBackground(Color.blue); turno=-turno;} jButton15.setEnabled(false); showStatus("presiono jButton15");} if(evt.getSource()==jButton14){ if (turno == -1){ jButton14.setBackground (Color.red); turno=-turno;} else{ jButton14.setBackground(Color.blue); turno=-turno;} jButton14.setEnabled(false); showStatus("presiono jButton14");} if(evt.getSource()==jButton13){ if (turno == -1){ jButton13.setBackground (Color.red); turno=-turno;} else{ jButton13.setBackground(Color.blue); turno=-turno;} jButton13.setEnabled(false); showStatus("presiono jButton13");} if(evt.getSource()==jButton12){ if (turno == -1){ jButton12.setBackground (Color.red); turno=-turno;} else{ jButton12.setBackground(Color.blue); turno=-turno;} jButton12.setEnabled(false); showStatus("presiono jButton12"); } if(evt.getSource()==jButton11){ if (turno == -1){ jButton11.setBackground (Color.red); turno=-turno;} else{ jButton11.setBackground(Color.blue); turno=-turno;} jButton11.setEnabled(false); showStatus("presiono jButton11"); } } }

Las subclases de AWTEvent definen mtodos similares, por ejemplo, la clase

La gestin de eventos : La clase AWEvent 10 - 14 ComponentEvent define un mtodo getComponent que retorna el componente (Component) que ha generado el evento. .

java.lang.Object java.util.EventObject

AWTEvent

ActionEvent

AdjustmentEvent

ComponentEvent

ItemEvent

TextEvent

ContainerEvent

FocusEvent

InputEvent

WindowEvent

KeyEvent

MouseEvent

Tipos de eventos
Los eventos se dividen en dos clases: de bajo nivel o de componente, y de alto nivel o semnticos.

Eventos de bajo nivel o de componente


Son aquellos que representan una entrada sobre un componente visual de un sistema de ventanas en la pantalla. Hacer click con el ratn, oprimir una tecla. La clase Component del AWT, define los mtodos de procesamiento y registro de escucha para eventos a nivel de componente. Por ejemplo el mtodo addMouseListener(), que agrega un escucha para recibir eventos del ratn en un componente,o addKeyListener() para agregar un escucha que reciba eventos del teclado en un componente. Todos los eventos a nivel de componente son subclases de java.awt.event, tales como :

La gestin de eventos : Tipos de eventos 10 - 15

ComponentEvent: Evento de bajo nivel que indica que un componente se

ha movido, cambiado su tamao, o cambiada su visibilidad.

FocusEvent: Evento generado por un componente, que indica que el

componente ha ganado o perdido su enfoque en el teclado.

InputEvent: es la clase raiz para todos los eventos de entrada a nivel de

componente. Los eventos de entrada son despachados a los escuchas antes que que sean procesados normalmente por las fuentes donde ellos se generaron.

KeyEvent: indica que se ha presionado una tecla en un componente. Este evento se genera por un objeto componente, por ejemplo un campo de texto, cuando una tecla es presionada, suelta, o se genera un carcter con ella presionndola y soltandola. MouseEvent: Evento que indica que ha sucedido una accion con el ratn

sobre algn componente. Estas acciones pueden ser: Eventos simples del ratn: un boton presionado, suelto o liberado, presionado y liberado, el cursor del ratn entra o sale de un componente. Eventos de movimiento del ratn: el ratn se ha movido, el ratn se ha movido con un boton presionado (dragged).

ContainerEvent: Evento que indica que el contenido de un contenedor ha

cambiado en virtud de haberse agregado o suprimido un componente.

WindowEvent: Evento que indica que una ventana ha cambiado su estado,

por ejemplo cuando se abre, se cierra, se activa o desactiva, cuando se minimiza (iconified) o restaura (deconified).

Eventos semnticos o de alto nivel


Aquellos que representan la funcin o significado de ms alto nivel de un evento, por ejemplo hacer doble clik con el ratn en una lnea de texto. Los siguientes son algunos eventos semnticos:

ActionEvent: evento que indica que ha sucedido una accin definida en un

componente, por ejemplo presionar un botn para que realice una funcin definida para ese componente.

AdjustmentEvent: este evento se genera cuando se ajusta el valor de de un

objeto ajustable.

La gestin de eventos : Tipos de eventos 10 - 16

ItemEvent:Este evento indica que un elemento ha sido seleccionado o deseleccionado, cambiando su estado, por ejemplo en una lista al seleccionar uno de sus elementos. TextEvent: evento que indica que un objeto texto por ejemplo TextComponent ha cambiado su texto.

Escuchadores de eventos
El control de eventos en un programa, aplicacin o applet, se lleva a cabo mediante el establecimiento de objetos escuchas (listeners) y registrarlos con sus orgenes (sources). Los mtodos de escucha se registran con addXyzListener (para agregarlo) y removeXyzListener (para removerlo). En donde Xyz es el nombre de la interfaz usada. Igualmente estas se dividen en interfaces alto y bajo nivel.

De bajo nivel
Las interfaces de bajo nivel para escuchas son las siguientes:

ComponentListener: Interface escucha que recibe eventos de componentes. Una clase que requiera procesar un evento de un componente implementa esta interface y todos los mtodos que contiene o extiende la clase abstracta ComponentAdapter,sobreescribiendo nicamente los mtodos de interes. El objeto escucha creado de esa clase es registrado con el componente usando el mtodo addComponentListener .

interface escucha que recibe eventos de contenedores. Una clase que requiera procesar un evento de un contenedor implementa esta interface y todos los mtodos que contiene o extiende la clase abstracta ContainerAdapter,sobreescribiendo nicamente los mtodos de interes. El objeto escucha creado de esa clase es registrado con el componente usando el mtodo addContainerListener. Cuando el contenedor cambia, bien sea porque se ha agregado o eliminado un componente, el mtodo referido en el objeto escucha es invocado y el ContainerEvent se le suministra.
FocusListener:Interface para recibir el foco del teclado sobre un

ContainerListener:

componente. En Java cuando un componente tiene foco, hace referencia a que las entradas del teclado se dirigen a ese componente.La clase interesada en recibir foco del teclado sobre un componente implemneta esta interface o extiende la clase abstracta FocusAdapter. El objeto escucha creado se registra con el componente usando el mtodo addFocusListener.

La gestin de eventos : Escuchadores de eventos 10 - 17 Cuando el componente gana (mtodo focusGained()) o pierde el foco (focusLost()) del teclado se invoca el respectivo mtodo y el FocusEvent se le suministra.

KeyListener: interface para recibir eventos generados por el teclado,

mediante presion de teclas (keystrokes), soltar la tecla o presionar y soltar una tecla. La clase intersada en procesar eventos de teclado implementa esta interface o extiende la clase abstracta KeyAdapter. El objeto escucha creado se registra con un componente usando el mtodo addKeyListener. Se invoca el mtodo relevante y se le suministra KeyEvent.

MouseListener:interface para recibir eventos del ratn tales como presionar o liberar un botn, hacer clik, entrar o salir de un componente. El movimiento y el arrastrado del ratn usan la interfaz MouseMotionListener. Una clase que requiera procesar los eventos del ratn indicados antes, deber implementar esta interface o extender la clase abstracta MouseAdapter. El objeto escucha creado es registrado con un componente usando el mtodo addMouseListener. Cuando sucede un evento del ratn se invoca el mtodo relevante en el objeto escucha y se le suministra el MouseEvent. MouseMotionListener: Interfaz que recibe movimientos y arrastre del

ratn. Una clase que requiera procesar este tipo de eventos debe implementar esta interfaz o extender la clase abstracta MouseMotionAdapter. El objeto escucha creado es registrado con un componente usando el mtodo addMouseMotionListener. Cuando se genera un evento de movimiento del ratn se invoca el mtodo relevante y se le suministra MouseEvent.

WindowListener: interfaz para escuchar eventos de ventana. La clase que

requiera procesar este tipo de eventos debera implementar esta interfaz o extender la clase abstarcta WindowAdapter. El objeto escucha creado es registrado con una ventana usando el mtodo addWindowListener. Cuando el estado de la ventana cambia, por ejemplo cuando se abre, se cierra, se activa o desactiva, se minimiza o se restaura, el mtodo respectivo se invoca y se le suministra WindowEvent.

De alto nivel
Las interfaces de alto nivel o semntico para escuchas son las siguientes:

ActionListener:interfaz para recibir eventos de accin sobre un

componente. La clase que requiera procesar un evento accin deber implementar esta interfaz y el objeto creado es registrado con el componente

La gestin de eventos : Escuchadores de eventos 10 - 18 usando el mtodo addActionListener. Cuando el evento accin (action) sucede se invoca el mtodo actionPerformed del objeto, y se le suministra un ActionEvent.

AdjustmentListener:interfaz para recibir eventos de ajuste. La clase que requiera procesar un evento de ajuste deber implementar esta interfaz. El objeto creado es registrado usando el mtodo addAdjustmentListener. Cuando un evento sucede se invoca el mtodo adjustmentValueChanged y se le suministra un AdjustmentEven. ItemListener: interfaz para recibir eventos tipo item, o de cambio de

estado de un elemento. La clase que requiera procesar este tipo de eventos deber implementar esta interfaz. El objeto creado es registrado con un componente usando el mtodo del componente addItemListener. Cuando sucee un evento de seleccin de un elemento o tem, el objeto escucha itemStateChanged es invocado y se le suministra un ItemEvent.

TextListener: interfaz para recibir eventos de texto. La clase que requiera

procesar este tipo de eventos deber implementar esta interfaz. El objeto creado es registrado con un componente usando el mtodo addTextListener. Cuando el texto del componente cambia el mtodo textValueChanged es invocado y se le suministra un TextEvent.

Clases Adaptadores de eventos


Todas las fuentes de eventos soportan el multienvo de receptores, es decir que se pueden aadir o quitar mltiples receptores de una sola fuente, de tal manera que la notificacin de que un evento se ha producido se puede enviar a uno o mas objetos escuchas simultneamente.
escucha de evento objeto evento fuente de evento escucha de evento escucha de evento

Muchas interfaces EvenListener estn diseadas para recibir mltiples clases de eventos, tal es el caso de la interfaz MouseListener, que permite recibir pulsaciones del ratn, liberacin del botn, entrar o salir de una ventana, etc. La interfaz tiene declarados mtodos para cada uno de estos tipos de eventos. A diferencia de ActionListener que tiene un solo mtodo, actionPerformed().

La gestin de eventos : Clases Adaptadores de eventos 10 - 19 La implementacin de una interfaz implica la redefinicin de todos los mtodos declarados en esta, an teniendolos que declarar como mtodos vacios. Ya se ha visto que, a fin de facilitar el uso de los escuchas, el AWT suministra un conjunto de clases abstractas denominadas adaptadores (adapters) que corresponden con las interfaces, de tal manera que cada adaptador implementa una interfaz y redefine todos los mtodos declarados en la interfaz como mtodos vacos, con lo cual se redefinirn por parte del usuario slo los mtodos requeridos, extendiendo o heredando esta clase.. De esta manera se definen receptores o escuchas extendiendo las clases Adapters, en lugar de implementar la interfaz correspondiente redediniendo todos sus mtodos . Debe sealarse que, se presenta un inconveniente para los applets, pues no podran extender una interface, pues heredan ya de por s de JApplet. Las clases adaptadoras en Java son las siguientes: java.awt.ComponetAdapter
java.awt.FocusAdapter java.awt.KeyAdapter

java.awt.MouseAdapter java.awt.MouseMotionAdapter java.awt.WindowAdapter

A continuacin se ver la manera de implementar el manejo de eventos en Java a traves de varias alternativas.

Manejo de eventos
Para detectar los eventos de un componente determinado se debe tener claro cmo se usa el componente y cuales son mecanismos de implementacin de su manejador de eventos. Como ya se indic antes, las applets tienen problemas con el uso de los adaptadores y deben utilizar la implementacin de la interfaz. Se pueden manejar eventos con los siguiente sesquemas: Todo manejador de eventos requiere las siguientes partes de cdigo: 1. Donde se declare la clase del manejador de eventos, el cdigo especifica que la clase o implementa un interface de oyente, o desciende una clase que

La gestin de eventos : Manejo de eventos 10 - 20 implementa un interface de oyente. Por ejemplo:


public class MiClase implements ActionListener {

Indica que la clase MiClase manejar eventos del tipo ActionEvent, por tal razn implementar el mtodo asociado con el escucha. 2. El cdigo que registra un ejemplar de la clase de manejo de eventos, sobre uno o ms componentes. Por ejemplo, para el componente algunComponente se le est acondicionando un escucha de AactionEvent :
algunComponente.addActionListener(instanciaDeMiClase);

Por ejemplo para asignarle a un botn su escucha de eventos, se procede con el siguiente cdigo:
miBoton.addActionListener(this);

3. La implementacin de los mtodos del interface oyente, en este caso la interfaz ActionListener tiene un slo mtodo a implementar, actionListener(ActionEvent e). Por ejemplo:
public void actionPerformed(ActionEvent e) { ...//codigo para reaccionar a la accion}

Para el caso de un botn miBoton, lo que se desea es mostrar en la lnea de estado de un applet, el mensaje Se ha presionado el boton, tenemos:
public void actionPerformed(ActionEvent e) { showStatus(Se ha presionado el boton); }

El ejemplo presentado antes con el applet MiApplet, ilustra el manejo tpico de eventos para el caso del componente Button.Un escenario de manejo de eventos tpico ocurre con los botones (JButton) versin de Button en Swing. 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 interface ActionListener. El programa debe registrar este objeto como un oyente de actin 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 interface ActionListener). El nico argumento del mtodo es un objeto ActionEvent que ofrece informacin sobre el evento y su fuente.
button ActionEvent actionListener

La gestin de eventos : Manejo de eventos 10 - 21

Cuando el usuario pulsa un botn, los oyentes de action del botn son notificados.Los manejadores de eventos pueden ser ejemplares de cualquier clase. Frecuentemente, se implementan usando clases internas annimas, lo que puede hacer el cdio algo ms confuso -- hasta que hayas usado las clases internas. El siguiente es un ejemplo de un applet bajo Swing:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Applet02 extends JApplet implements ActionListener { int numClicks=0; JLabel label2 = new JLabel(); public void init() { JButton boton1 = new JButton("Soy un boton"); boton1.addActionListener(this); getContentPane().setLayout(new GridLayout(0,1));

getContentPane().add(boton1); label2.setLabelFor(boton1); getContentPane().add(label2); }


public void actionPerformed(ActionEvent e){

numClicks = numClicks+1;
label2.setText("numero de clicks = "+numClicks);}

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, por ejemplo.

Manejo de eventos ActionEvent


Si se desea manejar varios botones se tiene el siguiente cdigo que permite manejar los ecuchas para tres botones:

La gestin de eventos : Manejo de eventos 10 - 22

import java.awt.*; import java.awt.event.*; import java.applet.*; public class Botones01 extends Applet implements ActionListener

{
String msg = " ";

Button botonSi,botonNo,botonOtro;
public void init (){ botonSi = new Button("si"); botonSi.addActionListener(this); botonNo = new Button("no"); botonNo.addActionListener(this); botonOtro = new Button("otro"); botonOtro.addActionListener(this);

add(botonSi); add(botonNo); add(botonOtro); }


public void actionPerformed(ActionEvent evento){ if(evento.getSource()== botonSi) msg = ("ha pulsado el boton si"); else if(evento.getSource()==botonNo) msg = "ha pulsado el boton no"; else

La gestin de eventos : Manejo de eventos 10 - 23


if(evento.getSource()==botonOtro) msg = "ha pulsado boton otro";

repaint(); }
public void paint(Graphics g){

g.drawString(msg,6,100); } }

En este caso se ha colocado un escucha del tipo ActionListener a cada uno de los botones. En esta version se tiene un sloi mtodo actionPerformed (ActionEvent e), dentro del cual se selecciona cual fu el boton que gener el evento. El mtodo getSource(), del evento generado, contiene el nombre del objeto o componente que gener ese evento. Dependiendo del boton presionado, se tomar la accion indicada en el mtodo actionPerformed(). Otra forma de escribir los oyentes para un componente, en este caso para eventos tipo ActionEvent, es mediante clases internas annimas asignadas a cada componente, como en la siguiente version de la clase Botones01b:
import import import import public java.awt.*; java.awt.event.*; java.applet.*; javax.swing.*; class Botones01b extends JApplet {

JButton botonSi,botonNo,botonOtro;
FlowLayout miFlow = new FlowLayout(); JLabel miEtiqueta = new JLabel("Soy una etiqueta");

Container contentPane = getContentPane();


public void init (){

contentPane.setLayout(miFlow);
botonSi = new JButton("si"); botonSi.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {


miEtiqueta.setText("Ha presionado boton Si");

} });
botonNo = new JButton("no"); botonNo.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {


miEtiqueta.setText("Ha presionado boton No");

} });
botonOtro = new JButton("otro"); botonOtro.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {


miEtiqueta.setText("Ha presionado boton Otro");

La gestin de eventos : Manejo de eventos 10 - 24


} }); contentPane.add(botonSi); contentPane.add(botonNo); contentPane.add(botonOtro); contentPane.add(miEtiqueta); } }

Obsrvese cmo se ha codificado el mtodo actionperformed para el caso del botn no.
botonNo = new JButton("no"); botonNo.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {


miEtiqueta.setText("Ha presionado boton No");

} });

De igual manera, con este mtodo no es necesario incluir la palabra implements de la interface. Otra forma es mediante clases internas, en este caso se ha definido la clse einterna MiManejador donde se manejarn las acciones de los botones. Esta clase debe implementar ActionListener:
import import import import public java.awt.*; java.awt.event.*; java.applet.*; javax.swing.*; class Botones01c extends JApplet{

JButton botonSi,botonNo,botonOtro;
String msg =" "; FlowLayout miFlow = new FlowLayout(); JLabel miEtiqueta = new JLabel("Soy una etiqueta");

Container contentPane = getContentPane();


public void init (){

contentPane.setLayout(miFlow);
botonSi = new JButton("si"); botonSi.addActionListener(new MiManejador()); botonNo = new JButton("no"); botonNo.addActionListener(new MiManejador()); botonOtro = new JButton("otro");

La gestin de eventos : Manejo de eventos 10 - 25


botonOtro.addActionListener(new MiManejador());

contentPane.add(botonSi); contentPane.add(botonNo); contentPane.add(botonOtro); contentPane.add(miEtiqueta); }


class MiManejador implements ActionListener{ public void actionPerformed(ActionEvent evento){ if(evento.getSource()== botonSi) msg = ("ha pulsado el boton si"); else if(evento.getSource()==botonNo) msg = "ha pulsado el boton no"; else if(evento.getSource()==botonOtro) msg = "ha pulsado boton otro";

miEtiqueta.setText(msg);}} }

En todos los tres casos se presentarn los mismos resultados. Un ejemplo de uso para el componente JTextField y botones, corresponde a la siguiente interfaz GUI:

La gestin de eventos : Manejo de eventos 10 - 26

import import import import

java.awt.*; java.awt.event.*; java.applet.*; javax.swing.*;

public class TextDemo extends JApplet implements ActionListener {

JTextField textField1, textField2; JLabel label1, label2;


String text="Holas";

JButton boton1, boton2, boton3, boton4; JTextArea textArea;


String public boton1 boton2 boton3 boton4 newline = "\n"; void init() { = new JButton("+"); = new JButton("-"); = new JButton("*"); = new JButton("/");

textField1 = new JTextField(20); textField2 = new JTextField(20); textField2.addActionListener(this); label1= new JLabel("Datos de a"); label2 = new JLabel("Datos de b"); textArea = new JTextArea(5, 20); textArea.setEditable(false); JScrollPane scrollPane = new JScrollPane(textArea,

JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

La gestin de eventos : Manejo de eventos 10 - 27


FlowLayout gridBag = new FlowLayout();

Container contentPane = getContentPane(); contentPane.setLayout(gridBag); contentPane.add(label1); contentPane.add(textField1); contentPane.add(label2); contentPane.add(textField2); contentPane.add(boton1); contentPane.add(boton2); contentPane.add(boton3); contentPane.add(boton4);contentPane.add(scrollPane);}
public void actionPerformed(ActionEvent evt) { int valor1, valor2, suma;

text = textField1.getText(); valor1 = Integer.parseInt(text); text = textField2.getText(); valor2 = Integer.parseInt(text); suma=valor1+valor2;


textArea.append("suma " +valor1+" + "+valor2+" = "+ suma+newline);

} }

Otro ejemplo de uso de ActionListener con clases internas para el manejo de los eventos.

import java.awt.*; import java.awt.event.*;

La gestin de eventos : Manejo de eventos 10 - 28


import javax.swing.*; public class TextFieldTest extends JFrame { private JTextField text1, text2, text3;

JLabel label1, label2, label3, label4;


private JPasswordField password; public TextFieldTest()

{
super( "Uso de JTextField y JPasswordField" );

Container c = getContentPane();
c.setLayout( new FlowLayout() ); label1 = new JLabel("Campo texto 1");

c.add(label1);
// se construye un textfield de tamao 10 text1 = new JTextField( 10 );

c.add( text1 );
label2 = new JLabel("Campo texto 2");

c.add(label2);
// se construye textfield con texto text2 = new JTextField( "Digite texto aqui" );

c.add( text2 );
label3 = new JLabel("Campo texto 3");

c.add(label3);
// construye textfield no editable con texto y tamao 20 text3 = new JTextField( "Campo de texto no editable", 20 ); text3.setEditable( false );

c.add( text3 );
label4 = new JLabel("Campo texto 4");

c.add(label4);
// construye password con texto por defecto password = new JPasswordField( "Esto no se puede ver" );

c.add( password );
TextFieldHandler handler = new TextFieldHandler();

text1.addActionListener( handler ); text2.addActionListener( handler ); text3.addActionListener( handler ); password.addActionListener( handler ); setSize( 250, 200 );

La gestin de eventos : Manejo de eventos 10 - 29


show(); }
public static void main( String args[] )

{
TextFieldTest app = new TextFieldTest();

app.addWindowListener(
new WindowAdapter() { public void windowClosing( WindowEvent e )

{ System.exit( 0 ); } } ); }
// clase interna para manejo de los eventos ActionEvent private class TextFieldHandler implements ActionListener { public void actionPerformed( ActionEvent e )

{
String s = ""; if ( s else s else s else e.getSource() == text1 ) = "text1: " + e.getActionCommand(); if ( e.getSource() == text2 ) = "text2: " + e.getActionCommand(); if ( e.getSource() == text3 ) = "text3: " + e.getActionCommand(); if ( e.getSource() == password ) {

JPasswordField pwd = (JPasswordField) e.getSource();


s = "password: " + new String( pwd.getPassword() );

}
JOptionPane.showMessageDialog( null, s );

} } }

Manejo de ItemListener
Es la interfaz escucha del tipo de eventos item. La clase interesada en procesar este tipo de eventos debe implementar esta interface. El objeto creado para escuchar debe usar el mtodo addItemListener. Cuando un evento resultante de la seleccion del item sucede se invoca el mtodo itemStateChanged().

La gestin de eventos : Manejo de ItemListener 10 - 30 Tiene un solo mtodo itemStateChanged(ItemEvent e). El siguiente ejmplo ilustra el uso de la interfaz ItemListener:

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CheckBoxTest extends JFrame { private JTextField t; private JCheckBox bold, italic, tipo, color; public CheckBoxTest()

{
super( "Prueba de JCheckBox" );

Container c = getContentPane();
c.setLayout(new FlowLayout()); t = new JTextField( "Mire el cambio de tipo", 30 ); t.setFont( new Font( "TimesRoman", Font.PLAIN, 14 ) );

c.add( t );
// crea objetos checkbox bold = new JCheckBox( "Bold" );

c.add( bold );
italic = new JCheckBox( "Italic" );

c.add( italic );
tipo= new JCheckBox(" Arial 15");

c.add(tipo);
color= new JCheckBox(" Color rojo");

c.add(color);

La gestin de eventos : Manejo de ItemListener 10 - 31

CheckBoxHandler handler = new CheckBoxHandler();

bold.addItemListener( handler ); italic.addItemListener( handler ); tipo.addItemListener(handler); color.addItemListener(handler); setSize( 350, 120 ); show(); }
public static void main( String args[] )

{
CheckBoxTest app = new CheckBoxTest();

app.addWindowListener(
new WindowAdapter() { public void windowClosing( WindowEvent e )

{ System.exit( 0 ); } } ); }
private class CheckBoxHandler implements ItemListener { private int valBold = Font.PLAIN; private int valItalic = Font.PLAIN; public void itemStateChanged( ItemEvent e )

{
if ( e.getSource() == bold ) if ( e.getStateChange() == ItemEvent.SELECTED )

valBold = Font.BOLD;
else

valBold = Font.PLAIN;
if ( e.getSource() == italic ) if ( e.getStateChange() == ItemEvent.SELECTED )

valItalic = Font.ITALIC;
else

valItalic = Font.PLAIN; t.setFont(


new Font( "TimesRoman", valBold + valItalic, 14 ) ); if(e.getSource()==tipo){ if( e.getStateChange() == ItemEvent.SELECTED ) t.setFont(new Font( "Arial", Font.BOLD, 15 ));} if(e.getSource()==color){ if( e.getStateChange() == ItemEvent.SELECTED )

La gestin de eventos : Manejo de ItemListener 10 - 32


t.setForeground(java.awt.Color.red);
else

t.setForeground(java.awt.Color.black); } t.repaint(); } } }

Obsrvese el uso de una clase interna para el manejo de los eventos del JcheckBox.

Manejo de Radio Buttons


Son similares a los JcheckBox, en cuanto pueden tener dos estados, seleccionado o deseleccionado. Sin embargo estos botones aparecen conformando grupos, en donde uno solo puede ser seleccionado, ya que representan opciones mutuamente excluyentes. Se agrupan dentro de un objeto del tipo ButtonGroup.

// Creacion de botones de radio usando ButtonGroup JRadioButton.


import java.awt.*; import java.awt.event.*; import javax.swing.*; public class RadioButtonTest extends JFrame { private JTextField t; private Font plainFont, boldFont,

La gestin de eventos : Manejo de Radio Buttons 10 - 33


italicFont, boldItalicFont;
private JRadioButton plain, bold, italic, boldItalic; private ButtonGroup radioGroup; public RadioButtonTest()

{
super( "Ejemplo botones " );

Container c = getContentPane();
c.setLayout( new FlowLayout() ); t = new JTextField( "Mireme como cambio de forma", 25 );

c.add( t );
// Crea botones plain = new JRadioButton( "Plain", true );

c.add( plain );
bold = new JRadioButton( "Bold", false);

c.add( bold );
italic = new JRadioButton( "Italic", false );

c.add( italic );
boldItalic = new JRadioButton( "Bold/Italic", false );

c.add( boldItalic );
// registra eventos RadioButtonHandler handler = new RadioButtonHandler();

plain.addItemListener( handler ); bold.addItemListener( handler ); italic.addItemListener( handler ); boldItalic.addItemListener( handler );


// agrupa los botones radioGroup = new ButtonGroup();

radioGroup.add( radioGroup.add( radioGroup.add( radioGroup.add(

plain ); bold ); italic ); boldItalic );

plainFont = new Font( "TimesRoman", Font.PLAIN, 14 ); boldFont = new Font( "TimesRoman", Font.BOLD, 14 ); italicFont = new Font( "TimesRoman", Font.ITALIC, 14 );

boldItalicFont =
new Font( "TimesRoman", Font.BOLD + Font.ITALIC, 14 );

t.setFont( plainFont ); setSize( 300, 100 ); show(); }


public static void main( String args[] )

{
RadioButtonTest app = new RadioButtonTest();

La gestin de eventos : Manejo de Radio Buttons 10 - 34


app.addWindowListener(
new WindowAdapter() { public void windowClosing( WindowEvent e )

{ System.exit( 0 ); } } ); }
private class RadioButtonHandler implements ItemListener { public void itemStateChanged( ItemEvent e )

{
if ( e.getSource() == plain )

t.setFont( plainFont );
else if ( e.getSource() == bold )

t.setFont( boldFont );
else if ( e.getSource() == italic )

t.setFont( italicFont );
else if ( e.getSource() == boldItalic )

t.setFont( boldItalicFont ); t.repaint(); } } }

Manejo de ComboBox
Un lista desplegable hacia abajo (drop-down-list) permite seleccionar un elemento de esta. Se implementan con la clase JcomboBox, el cual genera eventos del tipo ItemEvent, as como los componentes JcheckBox y JradioButtons.

// Uso del JComboBox para seleccionar una imagen para el icono de

La gestin de eventos : Manejo de ComboBox 10 - 35


// una etiqueta
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComboBoxTest extends JFrame { private JComboBox images; private JLabel label; private String names[] = { "smile01.gif", "smile02.gif", "smile03.gif", "llora01.gif", "susto.gif" }; private Icon icons[] = { new ImageIcon( names[ 0 ] ), new ImageIcon( names[ 1 ] ), new ImageIcon( names[ 2 ] ), new ImageIcon( names[ 3 ] ), new ImageIcon( names[ 4 ] ) }; public ComboBoxTest()

{
super( "Chequeo de JComboBox" );

Container c = getContentPane();
c.setLayout( new FlowLayout() ); images = new JComboBox( names );

images.setMaximumRowCount( 4 ); images.addItemListener(
new ItemListener() { public void itemStateChanged( ItemEvent e )

{ label.setIcon( icons[ images.getSelectedIndex() ] ); } } ); c.add( images );


label = new JLabel( icons[ 0 ] );

c.add( label ); setSize( 350, 100 ); show(); }


public static void main( String args[] )

{
ComboBoxTest app = new ComboBoxTest();

app.addWindowListener(

La gestin de eventos : Manejo de ComboBox 10 - 36


new WindowAdapter() { public void windowClosing( WindowEvent e )

{ System.exit( 0 ); } } ); } }

Manejo de oyentes del mouse


Los eventos del mouse suceden cuando el usuario utiliza el ratn para interactuar con algn componente de la ventana de su programa. Los eventos del mouse se han agrupado bajo dos interfaces: MouseListener y MouseMotionListener. Estas interfaces pueden ser implementadas por el programa que las requiera, con la condicin de tener que implementar todos los mtodos, para lo cual se dejarn vacios los no requeridos. La alternativa de utilizar la clase adaptadora respectiva, MouseAdapter y MouseMotionAdapter. El uso de estas implica heredarlas e implementar solamente el mtodo o los mtodos deseados. Como ya se ha visto en las Applets se dificulta el uso de la clase adaptadora.

Metodos de MouseListener
void

mouseClicked(MouseEvent e) Invocado cuando el mouse se ha dado un click sobre algn componente. mouseEntered(MouseEvent e) Invocado cuando el mouse entra a algn componente. mouseExited(MouseEvent e) Invocado cuando el mouse sale de un componente. mousePressed(MouseEvent e) Invocado cuando el mouse es presionado sobre un componente. mouseReleased(MouseEvent e) Invocado cuando el mouse se ha liberado sobre un componente.

void

void

void

void

La gestin de eventos : Manejo de oyentes del mouse 10 - 37 Su clase adaptadora MouseAdapter

Metodos de MouseAdapter
void

mouseClicked(MouseEvent e) Invocado cuando el mouse se ha dado un click sobre algn componente. mouseEntered(MouseEvent e) Invocado cuando el mouse entra a algn componente. mouseExited(MouseEvent e) Invocado cuando el mouse sale de un componente. mousePressed(MouseEvent e) Invocado cuando el mouse es presionado sobre un componente. mouseReleased(MouseEvent e) Invocado cuando el mouse se ha liberado sobre un componente.

void

void

void

void

Los mtodos de la interfaz MouseMotionListener

Metodos de MouseMotionListener
void

mouseDragged(MouseEvent e) Invocado cuando el botn del mouse se presiona y se arrastra sobre un componente. mouseMoved(MouseEvent e) Invocado cuando el mouse se ha movido sobre un componente.

void

Y su clase adaptadora MouseMotionAdapter

Metodos de MouseMotionAdapter

La gestin de eventos : Manejo de oyentes del mouse 10 - 38


void

mouseDragged(MouseEvent e) Invocado cuando el botn del mouse se presiona y se arrastra sobre un componente. mouseMoved(MouseEvent e) Invocado cuando el mouse se ha movido sobre un componente.

void

La clase MouseEvent
Como se puede observar, todos los mtodos de los escuchas del mouse tienen como argumento un objeto MouseEvent. Los siguientes son los mtodos de la clase MouseEvent.

Metodos clase MouseEvent


int

getButton() Retorna cual de los botones se ha presionado. getClickCount() Retorna el numero de clicks del mouse sobre un componente. getMouseModifiersText(int modifiers) Retorna una cadena quie describe las teclas modificadoras que se han presionado, tales como "Shift", o "Ctrl+Shift". getPoint() Retorna los valores x,y de la posicin donde se gener el evento relativo al componente. getX() Retorna la posicin horizontal x del evento generado en el componente. getY() Retorna la posicin vertical y del evento generado en el componente. paramString() Retorna una cadena identificando el evento.

int

static St ring

Point

int

int

String

La gestin de eventos : Manejo de oyentes del mouse 10 - 39


void

translatePoint(int x, int y) Traslada el sistema coordenado a una nueva posicin indicada por la adicin de los valores especificados x (horizontal), y (vertical).

Ejemplo de MouseListener

import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; public class Botones01d extends JApplet implements MouseListener { String msg = " ";

JButton botonSi,botonNo,botonOtro;
FlowLayout miFlow = new FlowLayout(); public void init (){

Container contenedor = getContentPane(); contenedor.setLayout(miFlow);


botonSi = new JButton("si"); botonSi.addMouseListener(this); botonNo = new JButton("no"); botonNo.addMouseListener(this); botonOtro = new JButton("otro"); botonOtro.addMouseListener(this);

contenedor.add(botonSi); contenedor.add(botonNo); contenedor.add(botonOtro);}


public void mouseEntered(MouseEvent evt){ if(evt.getSource()== botonSi) msg = ("ha entrado a si"); else if(evt.getSource()==botonNo) msg = "ha entrado a boton no";

La gestin de eventos : Manejo de oyentes del mouse 10 - 40


else if(evt.getSource()==botonOtro) msg = "ha entrado a boton otro";

showStatus(msg);}
public void mouseClicked(MouseEvent evt){ if(evt.getSource()== botonSi) msg = ("ha dado click en si"); else if(evt.getSource()==botonNo) msg = "ha dado click en no"; else if(evt.getSource()==botonOtro) msg = "ha dado click en otro"; showStatus(msg);} public void mouseReleased(MouseEvent evt){ if(evt.getSource()== botonSi) msg = ("ha soltado mouse en si"); else if(evt.getSource()==botonNo) msg = "ha soltado mouse en no"; else if(evt.getSource()==botonOtro) msg = "ha soltado mouse en otro";

showStatus(msg); }
public void mousePressed(MouseEvent evt){ if(evt.getSource()== botonSi) msg = ("ha presionado mouse en si"); else if(evt.getSource()==botonNo) msg = "ha presionado mouse en no"; else if(evt.getSource()==botonOtro) msg = "ha presionado mouse en otro";

showStatus(msg); }
public void mouseExited(MouseEvent evt){ if(evt.getSource()== botonSi) msg = ("ha salido de si"); else if(evt.getSource()==botonNo) msg = "ha salido de no"; else if(evt.getSource()==botonOtro) msg = "ha salido de otro";

showStatus(msg); } }

Otro ejemplo de uso de MouseListener con campos de etiqueta:

La gestin de eventos : Manejo de oyentes del mouse 10 - 41

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class LabelTest extends JFrame implements MouseListener{ private JLabel label1, label2, label3, label4; String msg, salida =" "; public LabelTest()

{
super( "Chequeo de JLabel" );

Container c = getContentPane();
c.setLayout( new FlowLayout() ); Icon mi = new ImageIcon("tb.gif"); label4 = new JLabel( "Salida de movimientos del mouse " , mi,SwingConstants.LEFT ); label4.setToolTipText( "Etiqueta 4" );

c.add( label4 );
label1 = new JLabel( "Etiqueta con texto" ); label1.setToolTipText( "Etiqueta 1" ); label1.addMouseListener(this);

c.add( label1 );
Icon bug = new ImageIcon( "bug1.gif" ); label2 = new JLabel( "Etiqueta con texto e icono",

bug, SwingConstants.LEFT );
label2.setToolTipText( "Etiqueta 2" ); label2.addMouseListener(this);

c.add( label2 );
label3 = new JLabel(); label3.setText( "Etiqueta con texto e icono abajo" );

label3.setIcon( bug );

La gestin de eventos : Manejo de oyentes del mouse 10 - 42


label3.addMouseListener(this);

label3.setHorizontalTextPosition( SwingConstants.CENTER ); label3.setVerticalTextPosition( SwingConstants.BOTTOM );


label3.setToolTipText( "Etiqueta 3" );

c.add( label3 ); setSize( 275, 200); show(); }


public void mouseEntered(MouseEvent evt){ if(evt.getSource()== label1) msg = ("ha entrado a Etiqueta 1"); else if(evt.getSource()==label2) msg = "ha entrado a Etiqueta 2"; else if(evt.getSource()==label3) msg = "ha entrado a Etiqueta 3"; salida+=msg +"\n";

label4.setText(msg);}
public public public public void void void void mouseClicked(MouseEvent evt){} mouseReleased(MouseEvent evt){} mousePressed(MouseEvent evt){} mouseExited(MouseEvent evt){}

public static void main( String args[] )

{
LabelTest app = new LabelTest();

app.addWindowListener(
new WindowAdapter() { public void windowClosing( WindowEvent e )

{ System.exit( 0 ); } } ); } }

También podría gustarte