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 java.awt.*;
import java.awt.event.*;
import java.applet.*;
import 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 .

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


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.

ActionEvent
button 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 java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
public 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 java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
public 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 java.awt.*;
import java.awt.event.*;
import java.applet.*;
import 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 newline = "\n";
public void init() {
boton1 = new JButton("+");
boton2 = new JButton("-");
boton3 = new JButton("*");
boton4 = 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 ( e.getSource() == text1 )
s = "text1: " + e.getActionCommand();
else if ( e.getSource() == text2 )
s = "text2: " + e.getActionCommand();
else if ( e.getSource() == text3 )
s = "text3: " + e.getActionCommand();
else 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( plain );
radioGroup.add( bold );
radioGroup.add( italic );
radioGroup.add( 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.
void mouseEntered(MouseEvent e)
Invocado cuando el mouse entra a algn componente.
void mouseExited(MouseEvent e)
Invocado cuando el mouse sale de un componente.
void mousePressed(MouseEvent e)
Invocado cuando el mouse es presionado sobre un componente.
void mouseReleased(MouseEvent e)
Invocado cuando el mouse se ha liberado sobre un componente.
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.
void mouseEntered(MouseEvent e)
Invocado cuando el mouse entra a algn componente.
void mouseExited(MouseEvent e)
Invocado cuando el mouse sale de un componente.
void mousePressed(MouseEvent e)
Invocado cuando el mouse es presionado sobre un
componente.
void mouseReleased(MouseEvent e)
Invocado cuando el mouse se ha liberado sobre un
componente.

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.
void mouseMoved(MouseEvent e)
Invocado cuando el mouse se ha movido sobre un
componente.

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.
void mouseMoved(MouseEvent e)
Invocado cuando el mouse se ha movido sobre un
componente.

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.
int getClickCount()
Retorna el numero de clicks del mouse sobre un
componente.
static St getMouseModifiersText(int modifiers)
ring
Retorna una cadena quie describe las teclas
modificadoras que se han presionado, tales como "Shift", o
"Ctrl+Shift".
Point getPoint()
Retorna los valores x,y de la posicin donde se
gener el evento relativo al componente.
int getX()
Retorna la posicin horizontal x del evento generado
en el componente.
int getY()
Retorna la posicin vertical y del evento generado en
el componente.
String paramString()
Retorna una cadena identificando el evento.
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 void mouseClicked(MouseEvent evt){}
public void mouseReleased(MouseEvent evt){}
public void mousePressed(MouseEvent evt){}
public void 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