Está en la página 1de 21

Eventos en Java

Ana Belén Martínez


EUITIO
Universidad de Oviedo

Tema 2

Eventos
„ Todo sistema operativo que utiliza interfaces gráficas 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


están 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

Comunicación Persona-Máquina 2 A. Belén Martínez

1
Tema 2

Eventos en Java
„ Cada vez que el usuario realiza una determinada acción sobre una
aplicación 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 método para que lo gestione.

„ El modelo de eventos de Java está basado en delegación (la


responsabilidad de gestionar un evento que ocurre en un objeto -
source- la tiene otro objeto-listener-)

Comunicación Persona-Máquina 3 A. Belén Martínez

Tema 2

Elementos del modelo de eventos en


Java
„ Jerarquías de clases de Eventos

„ Fuentes de Eventos (event sources)

„ Receptores de Eventos (event listener)

„ Adaptadores (adapter classes)

Comunicación Persona-Máquina 4 A. Belén Martínez

2
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 :
„ Botón 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.

Comunicación Persona-Máquina 5 A. Belén Martínez

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 están organizados en jerarquías de clases de eventos


Clase EventObject tiene un
La clase ActionEvent tiene un método getSource() que devuelve
método getActionCommand()
que devuelve una cadena con el
* el componente que produjo el
evento
mandato asociado con esta acción

* En este gráfico se
representan algunos de
los eventos más
representativos

Comunicación Persona-Máquina 6 A. Belén Martínez

3
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 específico, denominado
interface listener.

„ Ejemplos de interfaces listener (paquete java.awt.event) son:


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

Comunicación Persona-Máquina 7 A. Belén Martínez

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)

Comunicación Persona-Máquina 8 A. Belén Martínez

4
Tema 2

Adaptadores
„ Los adaptadores (adapter classes) tienen como objetivo evitar la tediosa tarea
de tener que implementar todos los métodos de las interfaces listener.

„ Por ello existe una clase adaptadora por cada interface listener que tiene más
de un método: MouseAdapter, WindowAdapter, KeyAdapter,
MouseMotionAdapter, FocusAdapter, ContainerAdapter y ComponentAdapter,
etc.

„ Las clases adaptadoras implementan los métodos de la interface


correspondiente como vacíos

Comunicación Persona-Máquina 9 A. Belén Martínez

Tema 2

Construcción 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 continuación vamos a ver todos estos conceptos con dos ejemplos

Comunicación Persona-Máquina 10 A. Belén Martínez

5
Tema 2

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

Comunicación Persona-Máquina 11 A. Belén Martínez

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

Comunicación Persona-Máquina 12 A. Belén Martínez

6
Tema 2

Clase del evento


„ En el caso del ejemplo que nos ocupa el evento que se genera al
presionar un botón es de tipo ActionEvent

•Pulsar un botón
•Seleccionar un elemento de una lista de
selección
•Seleccionar un elemento de un menú
•Pulsar [Enter] en un campo de texto

Comunicación Persona-Máquina 13 A. Belén Martínez

Tema 2

Receptor del evento


„ El receptor para un evento ActionEvent debe ser una clase que
implemente el interface ActionListener que únicamente contiene un
método: actionPerformed.
public interface ActionListener extends EventListener{

public void actionPerformed (ActionEvent e){

}
}

Comunicación Persona-Máquina 14 A. Belén Martínez

7
Tema 2

Receptor del evento (II)


class Marco1 extends JFrame{

void cambiaColor(ActionEvent e){
contentPane.setBackground(Color.blue);
}… Clase ProcesaBoton es una
clase interna de la clase
class ProcesaBoton implements ActionListener { Marco1 lo que hace que se
pueda invocar el método
public void actionPerformed(ActionEvent e){ cambiaColor directamente

cambiaColor(e);
}
}

private void jbInit(){

ProcesaBoton pB = new ProcesaBoton();
…}
}

Comunicación Persona-Máquina 15 A. Belén Martínez

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 botón)
automáticamente se llama al método apropiado (actionPerformed),
pasándole como parámetro un objeto que es una instancia de
ActionEvent.

Comunicación Persona-Máquina 16 A. Belén Martínez

8
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);
}…}
} Comunicación Persona-Máquina 17 A. Belén Martínez

Tema 2

Construcción de la clase receptora ProcesaBoton


„ Vamos a ver a continuación las dos formas de construir la clase receptora
“ProcesaBoton”:

„ Como clase interna de la clase Marco1 (es la ya comentada en la transparencia 15)

„ Pasándole una referencia a la clase Marco1 en el constructor

„ Vamos a ver también como genera Jbuilder ambas posibilidades

Comunicación Persona-Máquina 18 A. Belén Martínez

9
Tema 2

Construcción 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(); Equivalente a:


jButtonAzul.addActionListener(pB); jButtonAzul.addActionListener (new ProcesaBoton());
}
}

Comunicación Persona-Máquina 19 A. Belén Martínez

Tema 2
Paso 1 Paso 2

Código generado por JBuilder


Clases Internas Anónimas

Paso 3

Comunicación Persona-Máquina 20 A. Belén Martínez

10
Tema 2

Código generado por Jbuilder (II)


Objeto Receptor creado a
public class Marco1 extends JFrame{ partir de una clase interna
sin nombre que implementa
Objeto
Registro el interface ActionListener
.... Fuente

//Inicialización 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

Comunicación Persona-Máquina 21 A. Belén Martínez

Tema 2

Construcción de la clase receptora ProcesaBoton


pasándole 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);

}
Comunicación Persona-Máquina 22 A. Belén Martínez

11
Tema 2
Paso 1

Paso 2

Código generado por JBuilder

Paso 3

Comunicación Persona-Máquina 23 A. Belén Martínez

Tema 2

Código generado por JBuilder (II)


public class Marco1 extends JFrame {
public Marco1() { Objeto Receptor creado a
try { Objeto partir de una clase a la que
jbInit(); Fuente se le pasa en el constructor
Registro
la referencia a la clase
}
Marco1
catch(Exception e) {
e.printStackTrace();
}
}
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; Clase Receptora
}
public void actionPerformed(ActionEvent e) {
adaptee.cambiaColor(e);
}
}
Comunicación Persona-Máquina 24 A. Belén Martínez

12
Tema 2

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

Comunicación Persona-Máquina 25 A. Belén Martínez

Tema 2

Fuente del evento

Fuente
del
evento
(tfDNI)

Comunicación Persona-Máquina 26 A. Belén Martínez

13
Tema 2

Clase del evento


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

Comunicación Persona-Máquina 27 A. Belén Martínez

Tema 2

Receptor del evento


„ El receptor para un evento FocusEvent debe ser una clase que
implemente el interface FocusListener que contiene dos métodos:
focusLost y focusGained.

Interface FocusListener extends EventListener {

public void focusLost (FocusEvent e ) { }


public void focusGained (FocusEvent e ){ }

Comunicación Persona-Máquina 28 A. Belén Martínez

14
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 método
compruebaLongitud
class ProcesaFoco implements FocusListener {
directamente
public void focusGained (FocusEvent e){ } // se deja vacío porque no lo utilizamos

public void focusLost (FocusEvent e) {

compruebaLongitud(e); }

}…
private void jbInit(){

ProcesaFoco pF = new ProcesaFoco();
…}
} // fin de la clase Marco1
Comunicación Persona-Máquina 29 A. Belén Martínez

Tema 2

Registro

tfDNI.addFocusListener(pF)

Comunicación Persona-Máquina 30 A. Belén Martínez

15
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
Comunicación Persona-Máquina 31 A. Belén Martínez

Tema 2

Adaptadores
„ Los adaptadores (adapter classes) tienen como objetivo evitar la tarea de
tener que implementar todos los métodos de las interfaces listener.

„ Las clases adaptadoras implementan los métodos de la interface


correspondiente como vacíos
„ En el ejemplo que nos ocupa, FocuListener tiene dos métodos: focusGained y
focusLost, pero realmente sólo queremos dar implementación a uno de ellos:
focusLost. Para ello acudimos a la clase adaptadora FocusAdapter.

Comunicación Persona-Máquina 32 A. Belén Martínez

16
Tema 2

Adaptadores (II)
class Marco1 extends JFrame{

void compruebaLongitud(FocusEvent e){

if (tfDNI.getText().length()!=8)

. . .}
class ProcesaFoco extends FocusAdapter { Solo se proporciona
implementación al método
public void focusLost (FocusEvent e) { focusLost

compruebaLongitud(e); }

}…
private void jbInit(){

ProcesaFoco pF = new ProcesaFoco();
tfDNI.addFocusListener(pF)

…}
} // fin de la clase marco
Comunicación Persona-Máquina 33 A. Belén Martínez

Tema 2

Construcción de la clase receptora como clase


interna de la clase Marco1 en JBuilder
Clases Internas Anónimas

Comunicación Persona-Máquina 34 A. Belén Martínez

17
Tema 2

Código generado por JBuilder


public class Marco1 extends JFrame {

public Marco1() {
try {
jbInit();
} Clase adaptadora interna de la
catch(Exception e) { clase Marco1 lo que hace que se
e.printStackTrace(); pueda invocar el método
} compruebaLongitud
}
directamente
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

Comunicación Persona-Máquina 35 A. Belén Martínez

Tema 2

Construcción de la clase receptora pasándole una


referencia al Marco1 en JBuilder

Comunicación Persona-Máquina 36 A. Belén Martínez

18
Tema 2

Código 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) { Clase Receptora


this.adaptee = adaptee;
}
public void focusLost(FocusEvent e) {
adaptee.comprobarLongitud(e);
}
}

Comunicación Persona-Máquina 37 A. Belén Martínez

Tema 2

Eventos - Resumen

Comunicación Persona-Máquina 38 A. Belén Martínez

19
Tema 2

Eventos – Resumen (I)


Evento Interfaz Oyente Adaptador Métodos de la interfaz Como se producen

ActionEvent ActionListener actionPerformed(ActionEvent) „ Pulsar un botón


„ Seleccionar un elemento de una
lista
„ Seleccionar un elemento de
menú
„ Pulsar enter en un campo de
texto
AdjustmentEvent AdjustmentListener adjustmentValueChanged(AdjustmentEvent) „Mover una barra de
desplazamiento

ComponentEvent ComponentListener ComponentAdapter componentHidden(ComponentEvent) „Cambiar de tamaño, mover,


componentShown(ComponentEvent) mostrar u ocultar un
componentMoved(ComponentEvent) componente.
componentResized(ComponentEvent)

ContainerEvent ContainerListener ContainerAdapter componentAdded (ContainerEvent) „Añadir o eliminar algún


componentRemoved (ContainerEvent) componente

Comunicación Persona-Máquina 39 A. Belén Martínez

Tema 2

Eventos – Resumen (II)


Evento Interfaz Oyente Adaptador Métodos de la interfaz Como se producen

FocusEvent FocusListener FocusAdapter focusGained (FocusEvent) „ Cuando un componente recibe

focusLost (FocusEvent ) o pierde el foco

KeyEvent KeyListener KeyAdapter keyPressed (KeyEvent) „Cuando se ha pulsado o liberado


KeyReleased (KeyEvent) una tecla
keyTyped (KeyEvent)

MouseEvent MouseListener MouseAdapter mouseClicked (MouseEvent) „Cuando se realizan ciertas


mouseEntered (MouseEvent) operaciones con el ratón
mouseExited (MouseEvent)
mousePressed (MouseEvent)
mouseReleased (MouseEvent)
MouseEvent MouseMotionListener MouseMotionAdapter mouseDragged ((MouseEvent) „Cuando se realizan ciertas
mouseMoved (MouseEvent) operaciones con el ratón

Comunicación Persona-Máquina 40 A. Belén Martínez

20
Tema 2

Eventos – Resumen (III)


Evento Interfaz Adaptador Métodos de la interfaz Como se producen
Oyente

WindowEvent WindowListener WindowAdapter windowOpened (WindowEvent) „ Cuando se realiza una

windowClosing (WindowEvent) determinada operación sobre


windowClosed (WindowEvent) una ventana
windowActivated (WindowEvent)
windowDeactivated (WindowEvent)
windowIconified (WindowEvent)
windowDeiconified (WindowEvent)

ItemEvent ItemListener itemStateChanged (ItemEvent) „ Cuando se selecciona una


casilla de verificación o una
lista de ítems

TextEvent TextListener textValueChanged (TextEvent) „Cuando se cambia algo en


un cuadro o área de texto

... ... ... ... ...

Comunicación Persona-Máquina 41 A. Belén Martínez

21

También podría gustarte