Está en la página 1de 21

Eventos en Java

Ana Beln Martnez EUITIO Universidad de Oviedo

Tema 2

Eventos
Todo sistema operativo que utiliza interfaces grficas de usuario debe estar constantemente monitorizando el entorno para capturar y tratar los eventos que se producen El sistema operativo informa de estos eventos a los programas que se estn ejecutando y entonces cada programa decide que hace para dar respuesta a esos eventos Los eventos pueden estar producidos por el sistema o por el usuario

Comunicacin Persona-Mquina

A. Beln Martnez

Tema 2

Eventos en Java
Cada vez que el usuario realiza una determinada accin sobre una aplicacin Java se produce un evento que el sistema operativo transmite a Java. Java crea un objeto de una determinada clase de evento, y este evento es transmitido a un determinado mtodo para que lo gestione. El modelo de eventos de Java est basado en delegacin (la responsabilidad de gestionar un evento que ocurre en un objeto source- la tiene otro objeto-listener-)

Comunicacin Persona-Mquina

A. Beln Martnez

Tema 2

Elementos del modelo de eventos en Java


Jerarquas de clases de Eventos Fuentes de Eventos (event sources) Receptores de Eventos (event listener) Adaptadores (adapter classes)

Comunicacin Persona-Mquina

A. Beln Martnez

Tema 2

Fuente de eventos
Los fuentes de eventos (event sources) son objetos que detectan eventos y notifican a los receptores que se han producido dichos eventos Ejemplos de fuentes :
Botn sobre el que se pulsa Campo de texto que pierde el foco Campo de texto sobre el que se presiona una tecla Ventana que se cierra Etc.

Comunicacin Persona-Mquina

A. Beln Martnez

Tema 2

Clase del evento


Cuando se produce un evento dicho evento es representado como un objeto de una clase que desciende de EventObject Los eventos estn organizados en jerarquas de clases de eventos
La clase ActionEvent tiene un mtodo getActionCommand() que devuelve una cadena con el mandato asociado con esta accin Clase EventObject tiene un mtodo getSource() que devuelve el componente que produjo el evento

* En este grfico se representan algunos de los eventos ms representativos

Comunicacin Persona-Mquina

A. Beln Martnez

Tema 2

Receptor del evento


Cuando ocurre un evento el objeto fuente necesita llamar a un objeto receptor Los receptores de eventos (event listener) son objetos instanciados de una clase que implementa un interface especfico, denominado interface listener. Ejemplos de interfaces listener (paquete java.awt.event) son:

ActionListener, AdjustmentListener, ComponentListener, ContainerListener, FocusListener, ItemListener, KeyListener, MouseListener, WindowListener,

Comunicacin Persona-Mquina

A. Beln Martnez

Tema 2

Registro
Cuando ya disponemos del objeto fuente y del objeto receptor es necesario asociarlos, es decir, hay que registrar el objeto receptor de eventos con el objeto fuente de los mismos:

objetoFuenteEventos.addEventListener (objetoReceptorEventos)

Comunicacin Persona-Mquina

A. Beln Martnez

Tema 2

Adaptadores
Los adaptadores (adapter classes) tienen como objetivo evitar la tediosa tarea de tener que implementar todos los mtodos de las interfaces listener. Por ello existe una clase adaptadora por cada interface listener que tiene ms de un mtodo: MouseAdapter, WindowAdapter, KeyAdapter, MouseMotionAdapter, FocusAdapter, ContainerAdapter y ComponentAdapter, etc. Las clases adaptadoras implementan los mtodos de la interface

correspondiente como vacos

Comunicacin Persona-Mquina

A. Beln Martnez

Tema 2

Construccin de la clase receptora


Por lo general la clase receptora necesita acceder a miembros de la clase Marco1 que contiene el objeto fuente. Para conseguir esto existen al menos dos posibilidades:
Pasar una referencia al Marco1 en el constructor de la clase receptora con lo que ya podr acceder a los miembros de dicha clase Marco1

Crear la clase receptora como una clase interna de la clase Marco1. Una clase interna es una clase definida dentro de otra clase y que tiene acceso a los miembros de la clase que la encierra.

Ambas posibilidades son permitidas por Jbuilber A continuacin vamos a ver todos estos conceptos con dos ejemplos
Comunicacin Persona-Mquina
10

A. Beln Martnez

Tema 2

Ejemplo 1. ActionEvent
- Cambiar el color del fondo de una ventana pulsando en un botn

Comunicacin Persona-Mquina

11

A. Beln Martnez

Tema 2

Fuente del evento


Es el objeto que detecta el evento y notifica a los receptores que se ha producido dicho evento Ej. (jButtonAzul)
Click o ALT+A

Fuente del evento

Comunicacin Persona-Mquina

12

A. Beln Martnez

Tema 2

Clase del evento


En el caso del ejemplo que nos ocupa el evento que se genera al presionar un botn es de tipo ActionEvent
Pulsar un botn Seleccionar un elemento de una lista de seleccin Seleccionar un elemento de un men Pulsar [Enter] en un campo de texto

Comunicacin Persona-Mquina

13

A. Beln Martnez

Tema 2

Receptor del evento


El receptor para un evento ActionEvent debe ser una clase que implemente el interface ActionListener que nicamente contiene un mtodo: actionPerformed.
public interface ActionListener extends EventListener{ public void actionPerformed (ActionEvent e){ } }

Comunicacin Persona-Mquina

14

A. Beln Martnez

Tema 2

Receptor del evento (II)


class Marco1 extends JFrame{ void cambiaColor(ActionEvent e){ contentPane.setBackground(Color.blue); } class ProcesaBoton implements ActionListener { public void actionPerformed(ActionEvent e){ cambiaColor(e); } } private void jbInit(){ ProcesaBoton pB = new ProcesaBoton(); } } Comunicacin Persona-Mquina
15 Clase ProcesaBoton es una clase interna de la clase Marco1 lo que hace que se pueda invocar el mtodo cambiaColor directamente

A. Beln Martnez

Tema 2

Registro
Finalmente, es necesario registrar el objeto receptor de eventos con el objeto fuente de los mismos:

jButtonAzul.addActionListener(pB)

Una vez registrado, cada vez que ocurre el evento (pulsamos el botn) automticamente se llama al mtodo apropiado (actionPerformed), pasndole como parmetro un objeto que es una instancia de

ActionEvent.

Comunicacin Persona-Mquina

16

A. Beln Martnez

Tema 2

Registro (II)
class Marco1 extends JFrame{ void cambiaColor(ActionEvent e){ contentPane.setBackground(Color.blue); } class ProcesaBoton implements ActionListener { public void actionPerformed(ActionEvent e){ cambiaColor(e); } } private void jbInit(){ ProcesaBoton pB = new ProcesaBoton(); jButtonAzul.addActionListener(pB); }} } Comunicacin Persona-Mquina
17

A. Beln Martnez

Tema 2

Construccin de la clase receptora ProcesaBoton


Vamos a ver a continuacin las dos formas de construir la clase receptora ProcesaBoton:

Como clase interna de la clase Marco1 (es la ya comentada en la transparencia 15) Pasndole una referencia a la clase Marco1 en el constructor

Vamos a ver tambin como genera Jbuilder ambas posibilidades

Comunicacin Persona-Mquina

18

A. Beln Martnez

Tema 2

Construccin de la clase receptora ProcesaBoton como clase interna de la clase Marco1


En este caso la clase ProcesaBoton se construye como una clase interna de la clase Marco1 lo que permitir el acceso a miembros de Marco1
public class Marco1 extends JFrame { class ProcesaBoton implements ActionListener { public void actionPerformed(ActionEvent e){ cambiaColor(e); } } public void jbInit(){ ProcesaBoton pB = new ProcesaBoton(); jButtonAzul.addActionListener(pB); } }
Equivalente a:

jButtonAzul.addActionListener (new ProcesaBoton());

Comunicacin Persona-Mquina

19

A. Beln Martnez

Tema 2
Paso 1 Paso 2

Cdigo generado por JBuilder

Clases Internas Annimas

Paso 3

Comunicacin Persona-Mquina

20

A. Beln Martnez

Tema 2

Cdigo generado por Jbuilder (II)


public class Marco1 extends JFrame{ .... //Inicializacin de componentes private void jbInit() throws Exception { ... jButtonAzul.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { cambiaColor(e); } }; } void cambiaColor(ActionEvent e) { contentPane.setBackground(Color.blue); } ... } // fin de la clase Marco1 Objeto Fuente Registro Objeto Receptor creado a partir de una clase interna sin nombre que implementa el interface ActionListener

Comunicacin Persona-Mquina

21

A. Beln Martnez

Tema 2

Construccin de la clase receptora ProcesaBoton pasndole una referencia al Marco1


En este caso a la clase ProcesaBoton se le pasa una referencia al Marco1 en el constructor de la clase.
class ProcesaBoton implements ActionListener { private Marco1 marco; public ProcesaBoton (Marco1 m){ marco = m; } public void actionPerformed(ActionEvent e){ marco.cambiaColor(e); } } public void jbInit(){ ProcesaBoton pB = new ProcesaBoton(this); jButtonAzul.addActionListener(pB); }
Comunicacin Persona-Mquina
22

A. Beln Martnez

Tema 2
Paso 1 Paso 2

Cdigo generado por JBuilder

Paso 3

Comunicacin Persona-Mquina

23

A. Beln Martnez

Tema 2

Cdigo generado por JBuilder (II)


public class Marco1 extends JFrame { public Marco1() { Objeto try { Fuente jbInit(); } catch(Exception e) { e.printStackTrace(); } Registro Objeto Receptor creado a partir de una clase a la que se le pasa en el constructor la referencia a la clase Marco1

} private void jbInit() throws Exception { jBotonAzul.addActionListener(new Marco1_jBotonAzul_actionAdapter(this)); } void cambiaColor(ActionEvent e) { contentPane.setBackground(Color.blue); } } // fin de la clase Marco1 class Marco1_jBotonAzul_actionAdapter implements java.awt.event.ActionListener { Marco1 adaptee; Marco1_jBotonAzul_actionAdapter(Marco1 adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.cambiaColor(e); }

Clase Receptora

Comunicacin Persona-Mquina

24

A. Beln Martnez

Tema 2

Ejemplo 2. FocusEvent
- Validar la longitud de un campo de texto (JTextField) cuando dicho componente pierde el foco.

Comunicacin Persona-Mquina

25

A. Beln Martnez

Tema 2

Fuente del evento

Fuente del evento

(tfDNI)

Comunicacin Persona-Mquina

26

A. Beln Martnez

Tema 2

Clase del evento


En el caso del ejemplo que nos ocupa el evento que se genera es de tipo FocusEvent.

Comunicacin Persona-Mquina

27

A. Beln Martnez

Tema 2

Receptor del evento


El receptor para un evento FocusEvent debe ser una clase que implemente el interface FocusListener que contiene dos mtodos: focusLost y focusGained.
Interface FocusListener extends EventListener { public void focusLost (FocusEvent e ) { } public void focusGained (FocusEvent e ){ } }

Comunicacin Persona-Mquina

28

A. Beln Martnez

Tema 2

Receptor del evento (II)


class Marco1 extends JFrame{ void compruebaLongitud(FocusEvent e){ if (tfDNI.getText().length()!=8) . . .}
Clase ProcesaFoco es una clase interna de la clase Marco1 lo que hace que se pueda invocar el mtodo compruebaLongitud directamente

class ProcesaFoco implements FocusListener {

public void focusGained (FocusEvent e){ } // se deja vaco porque no lo utilizamos public void focusLost (FocusEvent e) { compruebaLongitud(e); } } private void jbInit(){ ProcesaFoco pF = new ProcesaFoco(); } } // fin de la clase Marco1 Comunicacin Persona-Mquina
29

A. Beln Martnez

Tema 2

Registro

tfDNI.addFocusListener(pF)

Comunicacin Persona-Mquina

30

A. Beln Martnez

Tema 2

Registro (II)
class Marco1 extends JFrame{ void compruebaLongitud(FocusEvent e){ if (tfDNI.getText().length()!=8) . . .} class ProcesaFoco implements FocusListener { public void focusGained (FocusEvent e){ } public void focusLost (FocusEvent e) { compruebaLongitud(e); } } private void jbInit(){ ProcesaFoco pF = new ProcesaFoco(); tfDNI.addFocusListener(pF) } } // fin de la clase Marco1 Comunicacin Persona-Mquina
31

A. Beln Martnez

Tema 2

Adaptadores
Los adaptadores (adapter classes) tienen como objetivo evitar la tarea de tener que implementar todos los mtodos de las interfaces listener. Las clases adaptadoras implementan los mtodos de la interface

correspondiente como vacos

En el ejemplo que nos ocupa, FocuListener tiene dos mtodos: focusGained y focusLost, pero realmente slo queremos dar implementacin a uno de ellos: focusLost. Para ello acudimos a la clase adaptadora FocusAdapter.

Comunicacin Persona-Mquina

32

A. Beln Martnez

Tema 2

Adaptadores (II)
class Marco1 extends JFrame{ void compruebaLongitud(FocusEvent e){ if (tfDNI.getText().length()!=8) . . .} class ProcesaFoco extends FocusAdapter { public void focusLost (FocusEvent e) { compruebaLongitud(e); } } private void jbInit(){ ProcesaFoco pF = new ProcesaFoco(); tfDNI.addFocusListener(pF)
Solo se proporciona implementacin al mtodo focusLost

} } // fin de la clase marco Comunicacin Persona-Mquina


33

A. Beln Martnez

Tema 2

Construccin de la clase receptora como clase interna de la clase Marco1 en JBuilder


Clases Internas Annimas

Comunicacin Persona-Mquina

34

A. Beln Martnez

Tema 2

Cdigo generado por JBuilder


public class Marco1 extends JFrame { public Marco1() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { tfDNI.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(FocusEvent e) { compruebaLongitud(e); } }); void compruebaLongitud(FocusEvent e) { if (tfDNI.getText().length()<8) { JOptionPane.showMessageDialog(this,"DNI incorrecto"); tfDNI.setText(" "); tfDNI.requestFocus(); } ... } // fin de la clase Marco1

Clase adaptadora interna de la clase Marco1 lo que hace que se pueda invocar el mtodo compruebaLongitud directamente

Comunicacin Persona-Mquina

35

A. Beln Martnez

Tema 2

Construccin de la clase receptora pasndole una referencia al Marco1 en JBuilder

Comunicacin Persona-Mquina

36

A. Beln Martnez

Tema 2

Cdigo generado por JBuilder


public class Marco1 extends JFrame { ... private void jbInit() throws Exception { ... tfDNI.addFocusListener(new Marco1_tfDNI_focusAdapter(this)); } void comprobarLongitud(FocusEvent e) { if (tfDNI.getText().length()<8) { JOptionPane.showMessageDialog(this,"DNI incorrecto"); tfDNI.setText(" "); tfDNI.requestFocus(); } } } // fin de la clase Marco1 class Marco1_tfDNI_focusAdapter extends java.awt.event.FocusAdapter { Marco1 adaptee; Marco1_tfDNI_focusAdapter(Marco1 adaptee) { this.adaptee = adaptee; } public void focusLost(FocusEvent e) { adaptee.comprobarLongitud(e); } Clase Receptora

Comunicacin Persona-Mquina

37

A. Beln Martnez

Tema 2

Eventos - Resumen

Comunicacin Persona-Mquina

38

A. Beln Martnez

Tema 2

Eventos Resumen (I)


Evento Interfaz Oyente Adaptador Mtodos de la interfaz Como se producen
ActionEvent ActionListener actionPerformed(ActionEvent) Pulsar un botn Seleccionar un elemento de una lista Seleccionar un elemento de men Pulsar enter en un campo de texto Mover una barra de desplazamiento

AdjustmentEvent

AdjustmentListener

adjustmentValueChanged(AdjustmentEvent)

ComponentEvent

ComponentListener

ComponentAdapter

componentHidden(ComponentEvent) componentShown(ComponentEvent) componentMoved(ComponentEvent) componentResized(ComponentEvent) componentAdded (ContainerEvent) componentRemoved (ContainerEvent)

Cambiar de tamao, mover, mostrar u ocultar un componente.

ContainerEvent

ContainerListener

ContainerAdapter

Aadir o eliminar algn componente

Comunicacin Persona-Mquina

39

A. Beln Martnez

Tema 2

Eventos Resumen (II)


Evento Interfaz Oyente Adaptador Mtodos de la interfaz Como se producen
FocusEvent FocusListener FocusAdapter focusGained (FocusEvent) focusLost (FocusEvent ) Cuando un componente recibe o pierde el foco

KeyEvent

KeyListener

KeyAdapter

keyPressed (KeyEvent) KeyReleased (KeyEvent) keyTyped (KeyEvent) mouseClicked (MouseEvent) mouseEntered (MouseEvent) mouseExited (MouseEvent) mousePressed (MouseEvent) mouseReleased (MouseEvent) mouseDragged ((MouseEvent) mouseMoved (MouseEvent)

Cuando se ha pulsado o liberado una tecla

MouseEvent

MouseListener

MouseAdapter

Cuando se realizan ciertas operaciones con el ratn

MouseEvent

MouseMotionListener

MouseMotionAdapter

Cuando se realizan ciertas operaciones con el ratn

Comunicacin Persona-Mquina

40

A. Beln Martnez

Tema 2

Eventos Resumen (III)


Evento Interfaz Oyente Adaptador Mtodos de la interfaz Como se producen
WindowEvent WindowListener WindowAdapter windowOpened (WindowEvent) windowClosing (WindowEvent) windowClosed (WindowEvent) windowActivated (WindowEvent) windowDeactivated (WindowEvent) windowIconified (WindowEvent) windowDeiconified (WindowEvent) Cuando se realiza una determinada operacin sobre una ventana

ItemEvent

ItemListener

itemStateChanged (ItemEvent)

Cuando se selecciona una casilla de verificacin o una lista de tems Cuando se cambia algo en un cuadro o rea de texto

TextEvent

TextListener

textValueChanged (TextEvent)

...

...

...

...

...

Comunicacin Persona-Mquina

41

A. Beln Martnez

También podría gustarte