Eventos en Java

15
Cuando el usuario de un programa o applet mueve el ratón, 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 gráfica es necesario aprender a utilizar los eventos. Nota: El JDK 1.0 tenía 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, sólo estudiaremos el modelo introducido en el JDK 1.1 que es muy superior al original y tiene trazas de ser definitivo. Cuando el usuario interactúa sobre los diversos componentes del awt, éstos generan eventos. La siguiente tabla muestra los eventos que cada tipo de componente puede generar y cuándo los genera. Tipo de Componente Eventos generados Hechos que los generan Button ActionEvent El usuario hace un clic sobre el botón. Checkbox ItemEvent El usuario selecciona o deselecciona el interruptor (Checkbox) CheckboxMenuIte m ItemEvent El usuario selecciona o deselecciona el interruptor (Checkbox) Choice ItemEvent El usuario selecciona o deselecciona un elemento de la lista Component ComponentEve nt El componente se mueve, cambia de tamaño, 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 botón del ratón, el cursor del ratón entra o sale o el usuario mueve o arrastra el

description

Ejemplo de diversos eventos en JAVA

Transcript of Eventos en Java

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 ComponenteEventos generadosHechos que los generan

ButtonActionEventEl usuario hace un clic sobre el botn.

CheckboxItemEventEl usuario selecciona o deselecciona el interruptor (Checkbox)

CheckboxMenuItemItemEventEl usuario selecciona o deselecciona el interruptor (Checkbox)

ChoiceItemEventEl usuario selecciona o deselecciona un elemento de la lista

Component

ComponentEventEl componente se mueve, cambia de tamao, se esconde o se exhibe

FocusEventEl componente gana o pierde el foco

KeyEventEl usuario pulsa o suelta una tecla

MouseEventEl usuario pulsa o suelta un botn del ratn, el cursor del ratn entra o sale o el usuario mueve o arrastra el ratn

ContainerContainerEventSe agrega o se quita un componente al contenedor

List ActionEventEl usuario hace doble clic en un elemento de la lista

ItemEventEl usuario selecciona o deselecciona un elemento de la lista

MenuItemActionEventEl usuario selecciona un elemento del men

ScrollbarAdjustmentEventEl usuario mueve la barra de desplazamiento

TextComponentTextEventEl usuario hace un cambio en el texto

TextFieldActionEventEl usuario termina de editar el texto (hace un intro)

WindowWindowEventLa 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. InterfazMtodos

ActionListeneractionPerformed(ActionEvent)

AdjustmentListeneradjustmentValueChanged(AdjustementEvent)

ComponentListenercomponentHidden(ComponentEvent)componentMoved(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)

ContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)

FocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)

ItemListeneritemStateChanged(ItemEvent)

KeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)

MouseListener

mouseClicked(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mousePressed(MouseEvent)mouseReleased(MouseEvent)

MouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)

TextListenertextValueChanged(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