Está en la página 1de 12

Cuando el usuario de un programa o applet mueve el ratn, o hace un clic o usa el

teclado, genera un Evento. En Java los eventos, como cualquier otra cosa, se
representan como instancias u objetos de alguna clase. Para programar una interfaz
grfica es necesario aprender a utilizar los eventos.
Nota: El JDK 1.0 tena un modelo de eventos que cambi radicalmente en el JDK 1.1. Aquel modelo est
"deprecated", es decir se sugiere dejar de usarlo. Por lo tanto no lo presentaremos, slo estudiaremos el
modelo introducido en el JDK 1.1 que es muy superior al original y tiene trazas de ser definitivo.
Cuando el usuario interacta sobre los diversos componentes del awt, stos generan
eventos. La siguiente tabla muestra los eventos que cada tipo de componente puede
generar y cundo los genera.
Tipo de
Componente
Eventos
generados
Hechos que los generan
Button ActionEvent El usuario hace un clic sobre el botn.
Checkbox ItemEvent
El usuario selecciona o deselecciona
el interruptor (Checkbox)
CheckboxMenuItem ItemEvent
El usuario selecciona o deselecciona
el interruptor (Checkbox)
Choice ItemEvent
El usuario selecciona o deselecciona
un elemento de la lista
Component





ComponentEvent
El componente se mueve, cambia de
tamao, se esconde o se exhibe
FocusEvent El componente gana o pierde el foco
KeyEvent El usuario pulsa o suelta una tecla
MouseEvent
El usuario pulsa o suelta un botn del
ratn, el cursor del ratn entra o sale o
el usuario mueve o arrastra el ratn
Container ContainerEvent
Se agrega o se quita un componente
al contenedor
List

ActionEvent
El usuario hace doble clic en un
elemento de la lista
ItemEvent
El usuario selecciona o deselecciona
un elemento de la lista
MenuItem ActionEvent
El usuario selecciona un elemento del
men
Scrollbar AdjustmentEvent
El usuario mueve la barra de
desplazamiento
TextComponent TextEvent El usuario hace un cambio en el texto
TextField ActionEvent
El usuario termina de editar el texto
(hace un intro)
Window WindowEvent La ventana se abre, se cierra, se
minimiza, se reestablece o se cierra.
Todos los eventos mencionados en la tabla estn en el paquete java.awt.event.
Nota: En Java hay otros eventos aparte de los mencionados en la tabla. Los eventos
en general se representan como objetos de subclases de la clase java.util.EventObject.
Hay muchas subclases de java.util.EventObject conocidas hoy en da que el alumno
puede consultar en la documentacin, pero las que usaremos en el curso son slo las
que aparecen en la tabla anterior y todas ellas son subclases (derivadas directa o
indirectamente) de java.awt.AWTEvent y pertenecen al paquete java.awt.event.
Para facilitar la tarea del programador se han creado una serie de interfaces que deben
implementarse cuando se quieren procesar algunos de estos eventos. La siguiente
tabla presenta estas interfaces con sus mtodos.
Interfaz Mtodos
ActionListener actionPerformed(ActionEvent)
AdjustmentListener adjustmentValueChanged(AdjustementEvent)
ComponentListener
componentHidden(ComponentEvent)
componentMoved(ComponentEvent)
componentResized(ComponentEvent)
componentShown(ComponentEvent)
ContainerListener
componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
FocusListener
focusGained(FocusEvent)
focusLost(FocusEvent)
ItemListener itemStateChanged(ItemEvent)
KeyListener
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener

mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener
mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
TextListener textValueChanged(TextEvent)
WindowListener



windowActivated(WindowEvent)
windowClosed(WindowEvent)
windowClosing(WindowEvent)
windowDeactivated(WindowEvent)
windowDeiconified(WindowEvent)
windowIconified(WindowEvent)
windowOpened(WindowEvent)
Todos los mtodos de estas interfaces son de tipo public void.
Cmo se utilizan estas interfaces para programar una interfaz grfica?
Supongamos que deseamos que en un Componente que estamos desarrollando
(tpicamante un Applet, Marco, Dilogo, Ventana o Panel) responda a los eventos
generados por el usuario sobre el mismo componente o sobre algunos otros
(tpicamente contenidos en l). Para ello convertimos a este componente en "escucha"
(Listener) de ciertos eventos generados por l o por los otros componentes. Convertir a
un componente en escucha de un tipo de eventos consiste en:
1. declarar que implementa la interfaz correspondiente,
2. implementar los mtodos de la interfaz y
3. agregarlo a la lista de escuchas del o de los componentes que originan ese tipo
de eventos. Esto se hace normalmente usando un mtodo como
addActionListener, addMouseListener, etc...
Por ejemplo, si queremos que un Applet responda a los movimientos del ratn sobre
el applet y a los clics sobre un botn b colocado en el applet, ser necesario declarar
en su lnea definitoria que implementa MouseMotionListener y ActionListener, luego
habr que implementar los mtodos de ambas interfaces y tambin habr que agregar
el applet a la lista de escuchas de eventos del ratn del propio applet y a la lista de
escuchas de ActionEvent del botn. En otras palabras hay que escribir algo as:
public class miApplet extends Applet implements
MouseMotionListener, ActionListener {
public void init() {
...
this.addMouseMotionListener(this);
b.addActionListener(this);
...
}
/* -- MouseMotionListener methods --*/
public void mouseDragged(MouseEvent e) {
...
}
public void mouseMoved(MouseEvent e) {
...
}
/* -- ActionListener method --*/
public void actionPerformed(ActionEvent e) {
...
}
}
Los ejemplos que se presentan a continuacin ilustran este procedimiento y muestran
cmo extraer informacin concreta de los eventos para responder a ellos
adecuadamente.

ActionEvent e ItemEvent
Nuestro primer ejemplo consta slo de tres botones con ttulos rojo, verde y azul y un
campo de texto en el que se escribe el evento generado al hacer clic sobre cualquiera
de los botones. Cuando se pulsa uno de los botones el color de fondo del applet
cambia al que indica el botn.

Este es el cdigo del applet.
package unidad04;

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

public class buttonsApplet extends Applet implements ActionListener {

Button b_rojo, b_verde, b_azul;
TextField tf;

public void init () {
add(b_rojo=new Button("rojo"));
add(b_verde=new Button("verde"));
add(b_azul=new Button("azul"));
add(tf=new TextField(80));
tf.setBackground(Color.white);
b_rojo.addActionListener(this);
b_verde.addActionListener(this);
b_azul.addActionListener(this);
}

/* --------------------- Action Listener ------------------ */

public void actionPerformed(ActionEvent e) {
tf.setText(e.paramString());
if (e.getSource()==b_rojo) {
setBackground(Color.red);
} else if (e.getSource()==b_verde) {
setBackground(Color.green);
} else if (e.getSource()==b_azul) {
setBackground(Color.blue);
}
}
}
El alumno debe revisar este cdigo y estudiar cmo se logra distinguir cual es el botn
que se ha pulsado. Observe que esto se hace utilizando e.getSource() que devuelve
precisamente el objeto que produjo el evento. De ah que para reconocer el botn
pulsado se hagan comparaciones de cada botn con e.getSource(). Otra manera de
distinguir los botones es comparando e.getActionCommand() con las etiquetas de los
botones (esto debe hacerse usando el mtodo equals de String y no la simple
igualdad == entre objetos).
El siguiente applet ilustra cmo se usan los eventos ItemEvent y ActionEvent. Los dos
campos de texto de la parte superior informan cul es el origen (source) del evento y el
tipo de evento de que se trata con su valor descriptivo, respectivamente.


Pruebe a realizar selecciones en todas las componentes, escribir en el campo de texto
y dar un intro (o return). Observe que se produce un ActionEvent al hacer clic sobre el
botn, al hacer un doble clic en uno de los elementos de la lista, al dar intro en el
campo de texto. Observe que un clic sencillo en la lista, una seleccin en el selector y
un clic en el interruptor produce un ItemEvent.
Estudie detenidamente el cdigo de este sencillo applet. Observe que fue construido
como una extensin de preActionApplet que haba sido creado en la unidad 2 con
todos sus componentes. Aqu slo se le agregaron las implementaciones de las
interfaces de ItemListener y ActionListener.

package unidad04;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import unidad02.preActionApplet;

public class actionApplet extends preActionApplet
implements ActionListener, ItemListener {

public void init () {
super.init();
b.addActionListener(this);
t.addActionListener(this);
lst.addActionListener(this);
lst.addItemListener(this);
ch.addItemListener(this);
chb.addItemListener(this);
}

/* --------------------- Action Listener ------------------ */

public void actionPerformed(ActionEvent e) {
if (e.getSource()==lst) {
tf[0].setText("e.getSource()=List");
} else if (e.getSource()==t) {
tf[0].setText("e.getSource()=TextField");
} else if (e.getSource()==b) {
tf[0].setText("e.getSource()=Botn");
}
tf[1].setText("ActionCommand; getActionCommand()=\""+e.getActionCommand()+"\"");
}

/* --------------------- Item Listener ------------------ */

public void itemStateChanged(ItemEvent e) {
if (e.getSource()==lst) {
tf[0].setText("e.getSource()=List");
} else if (e.getSource()==ch) {
tf[0].setText("e.getSource()=Choice");
} else if (e.getSource()==chb) {
tf[0].setText("e.getSource()=Checkbox");
}
tf[1].setText("ItemEvent; paramString()=\""+e.paramString()+"\"");
}
}
El siguiente applet presenta un conocido juego de bolsillo que en mi tierra y en mi
poca (Mxico D.F., aos 50) se le llamaba "imposible". Su objetivo es comenzar con
un marco con los cuadritos en desorden y ordenarlos moviendo cada vez alguno de los
cuadros adyacentes al espacio vaco. A veces contbamos el tiempo que tardbamos
en ordenarlo y hacamos competencias. El nombre "imposible" vena de que si uno
malintencionadamente sacaba los cuadros de lugar y los pona en orden pero haciendo
una nica permutacin, por ejemplo del 1 con el 2, resultaba imposible ordenarlo sin
volver a sacar los cuadros del marco. La forma aparentemente complicada en que se
program la accin de desordenar los cuadros es para simular un desordenamiento
que deje los cuadros con una solucin posible. Se hizo precisamente desordenando
paso a paso como si se hiciera manualmente. Tambin este applet se construy como
una extensin de preImposible, creado anteriormente en la unidad 2.
package unidad04;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
import unidad02.preImposible;

public class imposible extends preImposible implements ActionListener {

private long T0;

public void init() {
super.init();
bb.addActionListener(this);
for (int j=0;j<4;j++) {
for (int i=0;i<4;i++) {
b[i][j].addActionListener(this);
}
}
}

public void start() {
desordenar();
}

protected void desordenar() {
int[][] ord=new int[4][4];
for (int i=0; i<16; i++) {
ord[i%4][i/4]=i+1;
}
ord[3][3]=0;
Random r=new Random();
for (int i=0; i<16000; i++) {
int k=(Math.abs(r.nextInt()))%16;
int m=k%4,n=k/4,aux=ord[m][n];
if ((m>0)&&(ord[m-1][n]==0)) {
ord[m][n]=ord[m-1][n];
ord[m-1][n]=aux;
}
if ((m<3)&&(ord[m+1][n]==0)) {
ord[m][n]=ord[m+1][n];
ord[m+1][n]=aux;
}
if ((n>0)&&(ord[m][n-1]==0)) {
ord[m][n]=ord[m][n-1];
ord[m][n-1]=aux;
}
if ((n<3)&&(ord[m][n+1]==0)) {
ord[m][n]=ord[m][n+1];
ord[m][n+1]=aux;
}
}
for (int i=0; i<16; i++) {
int k=ord[i%4][i/4];
if (k>0) {
b[i%4][i/4].setLabel(Integer.toString(ord[i%4][i/4]));
} else {
b[i%4][i/4].setLabel("");
}
}
tf.setText("El tiempo est corriendo...");
T0=System.currentTimeMillis();
}

void permuta(Button b1, Button b2) {
String aux=b1.getLabel();
b1.setLabel(b2.getLabel());
b2.setLabel(aux);
}

void mueve(int i,int j) {
if ((i>0)&&(b[i-1][j].getLabel().equals(""))) {
permuta(b[i][j],b[i-1][j]);
}
if ((i<3)&&(b[i+1][j].getLabel().equals(""))) {
permuta(b[i][j],b[i+1][j]);
}
if ((j>0)&&(b[i][j-1].getLabel().equals(""))) {
permuta(b[i][j],b[i][j-1]);
}
if ((j<3)&&(b[i][j+1].getLabel().equals(""))) {
permuta(b[i][j],b[i][j+1]);
}
}

public boolean terminado() {
for (int i=0; i<15; i++) {
if (!b[i%4][i/4].getLabel().equals(Integer.toString(i+1))) {
return false;
}
}
return true;
}

public void actionPerformed(ActionEvent e) {
if (e.getSource()==bb) {
desordenar();
} else {
for (int j=0;j<4;j++) {
for (int i=0;i<4;i++) {
if (e.getSource()==b[i][j]) {
mueve(i,j);
}
if (terminado()) {
int T=(int)((System.currentTimeMillis()-T0)/1000);
String min=Integer.toString(T/60);
String seg=Integer.toString(T%60);
if (seg.length()<2) {
seg="0"+seg;
}
tf.setText("Tiempo utilizado (min:seg):"+min+":"+seg);
T0=System.currentTimeMillis();
}
}
}
}
}

}

El alumno debe estudiar el cdigo de este ejemplo con gran detenimiento. Debe
observar sobre todo cmo se program la respuesta a los clics sobre los botones.
Observe que para saber sobre cual botn se hizo el clic el programa recorre todos los
botones e investiga si la fuente (e.getSource()) del evento es ese botn. Por otro lado, e
independientemente de la implementacin de la interfaz ActionListener, el alumno puede
obtener mucha experiencia de este cdigo.
Es importante que el alumno observe la ventaja que ha representado en estos dos
ejemplos separar el aspecto grfico del aspecto funcional, lo cual se hizo programando
primero un applet en el que slo se crean y acomodan los componentes grficos y
luego creando una subclase que agrega la funcionalidad, es decir, el tratamiento de los
eventos.

MouseEvent e MouseMotionEvent
Para comenzar presentamos un sencillo applet que muestra todos los MouseEvents que
se producen sobre una pequea pizarra roja. Pase el rarn por encima de la pizarra,
haga click en ella, arrstrelo, etc... y vea el evento que se produce en cada caso escrito
en el cuadro de texto si se trata de un MouseEvent y en el campo de texto si en un
MouseMotionEvent.

Compruebe que cuando el ratn entra al cuadro rojo se produce un evento
MOUSE_ENTERED y cuando sale se produce un MOUSE_EXITED. Compruebe que
cuando se hace un clic se producen (en este orden) los eventos MOUSE_PRESSED,
MOUSE_RELEASED y MOUSE_CLICKED. Compruebe tambin que cuando se pulsa
un botn, se hace un arrastre y luego se suelta el botn, hay un MOUSE_PRESSED y
MOUSE_RELEASED pero no un MOUSE_CLICKED. Qu diferencia hay si se pulsa
el botn derecho en lugar del izquierdo? Cmo se nota si un arrastre se est haciendo
con el botn izquierdo o con el derecho? (Para responder a esta ltimas preguntas
observe el valor de mods, que son lo modificadores o "modifiers" del evento). Qu
pasa si se hace un doble clic?
Es importante saber que toda la informacin que aparece en el cuadro de texto o en el
campo de texto puede extraerse del evento dentro del programa usando los mtodos
de la clase MouseEvent (o de alguna de sus superclases) como getModifiers(),
getClickCount(), getX(), getY(), etc...
Este es el sencillo cdigo de este applet:

Estdielo y utilcelo como informacin y como fuente para otros programas que debar
responder a las acciones del ratn. Observe que cada vez que se agrega un evento al
cuadro de texto se pone el cursor (caret) al final para asegurar que lo ltimo que se
agrega es visible.
Ahora presentamos un applet que es ya un programa donde se utilizan los eventos del
ratn y que sirve para hacer dibujos sencillos. Para ello implementa las interfaces
MouseEvent y MouseMotionEvent, adems de ActionEvent e ItemEvent. Est basado en el
applet preDibuja creado en la unidad 2.

Estudie detenidamente el cdigo de este applet, prestando particular atencin a la
implementacin de los mtodos que responden al ratn, es decir los mtodos
mousePressed, mouseDragged, etc... Con ello aprender la tcnica que se suele emplear
en los programas que responden a lo que el usuario hace con el ratn, es decir
aprender a programar interfaces grficas que usan el ratn.


Las otras interfaces de eventos que no se han ilustrado funcionan igual que estas,
aunque por supuesto cada una de ellas tiene sus peculiaridades y detalles que hay que
conocer. Dos de las ms importantes son WindowListener (que ya se us en la unidad
3) y KeyListener. Los ejercicios 4.6 y 4.7 piden al alumno estudiar y aplicar estas
interfaces.
Esta unidad tiene poco texto, pero el contenido de los ejemplos es muy denso e
importante y conviene estudiarlos todos detenidamante. Como podr comprobar el
alumno, la unidad tambin tiene muchos ejercicios.

WindowEvent
Los WindowEvents los producen las ventanas (Window), los cuadros de dilogo (Dialog) y
los marcos (Frame) cuando stos se abren, se activan se desactivan, se minimizan o
maximizan y cuando se cierran. El siguiente applet ayuda a entender cundo se
producen estos eventos durante la vida de un marco.

Al pulsar el botn del applet se crea un marco (rojo) que aparece en la pantalla. Al
mismo tiempo se escriben en el cuadro de texto los eventos generados que
normalmente son dos: windowOpened y windowActivated (por alguna razn extraa a veces
windowActivated no se produce, as que no hay que contar con l). Si el alumno
selecciona otra ventana, como por ejemplo la del navegador, ver que se produce el
evento windowDeactivated. Si selecciona de nuevo el marco rojo ver que se produce el
evento windowActivated. Si pulsa el botn de minimizar se produce el evento
windowIconified (y tambin windowDeactivated) y si reactiva el marco seleccionndolo en
la barra de tareas de windows ver que se produce el evento windowDeiconified (y
tambin windowActivated). Finalmente si pulsa el botn de cerrar el marco ver que se
produce el evento windowClosing y posteriormente windowClosed.
La pulsacin del botn de cerrar slo produce el evento windowClosing, es el hecho de
que en el mtodo windowClosing(WindowEvent e) del applet hemos puesto la instruccin
frame.dispose() lo que realmente produce el windowClosed. Por esta razn, para realmente
cerrar una ventana es necesario destruirla con el mtodo dispose() para que realmente
desaparezca. Si en lugar de dispose() se llama por ejemplo a setVisible(false) la ventana
se hace invisible pero no deja de existir y el evento windowClosed no llega a producirse.
Abajo aparece el cdigo de este applet. El alumno debe estudiarlo cuidadosamente
para entender perfectamente su funcionamiento que ilustra de forma general el ciclo de
vida de un marco (Frame).

En los ejercicios se pide al alumno crear dos applets semejantes a ste que lancen una
ventana y un cuadro de dilogo respectivamente. Con ellos el alumno ver que las
ventanas y los cuadros de dilogo tambin producen algunos de los WindowEvents.
Cules producen los cuadors de dilogo? Cules producen las ventanas? Son los
mismos?
Aqu se presentas estos applets (sin cdigo pues eso lo tendrn que hacer los
alumnos) para que jugando con ellos el alumno pueda responder estas preguntas.


Finalmente repetimos abajo el applet de las ventanas que se introdujo en la unidad 3
como otra ilustracin del uso de WindowEvent.
El cdigo del marco de tipo ventanas que se abre al pulsar el botn del applet "ventanas"
aparee abajo. El alumno podr observar que este applet implementa WindowListener y
por tal motivo tiene los mtodos windowOpened, windowActivated, windowDeactivated,
windowIconified, windowDeiconified, windowClosed, windowClosing. Casi todos ellos estn vacos
pues para lo nico que hemos usar esta interfaz es para responder al botn de cerrar
que aparece siempre arriba a la derecha de los marcos, lo cual se logra con el cdigo
del mtodo windowClosing. Casi siempre esta es la manera en que se utiliza WindowEvent
y la interfaz WindowListener.

http://arquimedes.matem.unam.mx/pasados/java_profundizacion/Unidad04.htm

También podría gustarte