Sei sulla pagina 1di 15

Programación Avanzada

Universidad del Aconcagua

Programación Avanzada
Gestión de Eventos en Java

Esp. Ing. César Aranda


unidatos@gmail.com

Licenciatura en Informática y Desarrollo de Software


v.2014

Analizando el Patrón Listener


 Genera dependencias entre objetos, para que un
componente dado (modelo) pueda informar a otros
(observadores) de que su estado ha cambiado.
 También denominado Observer
 Patrón de Comportamiento
 Resulta aplicable cuando:
 un cambio de estado en un objeto requiere cambios en otros
objetos, y no sabe sobre qué objetos debe aplicarse el cambio.
 un objeto debe ser capaz de notificar algo a otros objetos, sin
hacer asunciones sobre quiénes son estos objetos.
 un cambio en un objeto implique cambios en otros y no se sepa
cuantos objetos necesitan cambiar.
Esp. Ing. César Omar Aranda 2

Ing. César Omar Aranda 1


Programación Avanzada
Universidad del Aconcagua

Estructura general
 ObserverIF: interface
que define el
comportamiento de un
observador.
 Observer: clase que
define a los objetos
observadores concretos
y que actúa en función
de las notificaciones
recibidas.
 ObservableIF: interface que define el comportamiento de un objeto
observado.
 Observable: clase que define a los objetos concretos que enviarán
las notificaciones al cambiar su estado.
 Multicaster: clase mediadora (opcional) que transfiere las
notifcaciones de los objetos concretos.
Esp. Ing. César Omar Aranda 3

Interacción

Como se puede observar en el siguiente diagrama el sujeto tiene un método notify()


que se encarga de mandar el mensaje de update() a todos los observadores

Esp. Ing. César Omar Aranda 4

Ing. César Omar Aranda 2


Programación Avanzada
Universidad del Aconcagua

Clase Observable de Java


1. public class Observable {
2. private boolean changed = false;
3. private Vector obs;
4. public Observable() {
5. obs = new Vector();
6. }
7. public synchronized void addObserver (Observer o) {..}
8. public synchronized void deleteObserver (Observer o) {..}
9. public void notifyObservers (Object arg) {..}
10. protected synchronized void setChanged() {..}
11. protected synchronized void clearChanged() {..}
12. public synchronized boolean hasChanged() {.. }
Esp. Ing. César Omar Aranda 5

Interface Observer de Java

public interface Observer {


void update (Observable o, Object arg);
}

Argumento pasado al
Argumento que referencia
método notifyObservers,
al objeto que ha enviado la
puede indicar el tipo de
notificación
cambio

 Update: método invocado cuando se produce un cambio en el


estado del objeto Observable

Esp. Ing. César Omar Aranda 6

Ing. César Omar Aranda 3


Programación Avanzada
Universidad del Aconcagua

Ejemplo Simple

Esp. Ing. César Omar Aranda 7

Ejemplo Simple en Java

Esp. Ing. César Omar Aranda 8

Ing. César Omar Aranda 4


Programación Avanzada
Universidad del Aconcagua

Eventos
 Sucesos asíncronos
 Como clic en un botón, pulsado de tecla, desplazamiento sobre
un componente, etc.
 No sabemos cuándo se producen
 Objetos de Evento
 Event
 Son generados por la JVM
 Mecanismo de entidades (objetos) de escucha (oyentes)
 Listeners : Son las clases (interfaces) provistas por Java
 Principio: Un objeto le dice (registrar) a otro objeto, con
capacidad de detección, que cuando pase algo, le avise.

Esp. Ing. César Omar Aranda 9

Eventos en Java 1.1


 Java 1.1 tiene un modelo de eventos basado en el patrón Observer.

 Event sources: Objetos capaces de generar eventos.


 Event listeners: Objetos que pueden ser notificados de eventos por
parte de la JVM
 Una fuente juega el papel de ConcreteSubject y un listener juega el
papel de ConcreteObserver.
 Los listeners deben registrarse en las fuentes.
 Un listener debe implementar una interfaz que proporciona los
métodos a ser llamados por la fuente para notificar un evento.
Esp. Ing. César Omar Aranda 10

Ing. César Omar Aranda 5


Programación Avanzada
Universidad del Aconcagua

Múltiples Listeners

Component

addEventListener Ocurre evento Event

EventListener
Ocurre evento Event
addEventListener

EventListener

Esp. Ing. César Omar Aranda 11

Interfaces Listener
 Existen diferentes interfaces listener, cada una
apropiada para un diferente tipo de evento GUI:
 ActionListener,
 ItemListener,
 KeyListener,
 MouseListener,
 WindowListener,
 ...

12

Ing. César Omar Aranda 6


Programación Avanzada
Universidad del Aconcagua

Componentes, Eventos y Listeners


 Cada componente tiene asociado uno o más eventos y
listeners.
 Por ejemplo:

Esp. Ing. César Omar Aranda 13

Secuencia de señales

Situación en la que un objeto se desplaza al hacer click


con el mouse sobre él.

Esp. Ing. César Omar Aranda 14

Ing. César Omar Aranda 7


Programación Avanzada
Universidad del Aconcagua

Mecanismo de propagación

Esp. Ing. César Omar Aranda 15

Objetos participantes

Esp. Ing. César Omar Aranda 16

Ing. César Omar Aranda 8


Programación Avanzada
Universidad del Aconcagua

Uso de Listener
 Pueden definirse nuevos oyentes.
 Para crear un listener la aplicación debe declarar una clase que
implementa alguna interfaz listener (listener interface)
 Pueden usarse definiciones basadas en clases internas (inner
class)

 Recordar que deben implementarse todos los métodos


que la interfaz listener define.

Esp. Ing. César Omar Aranda 17

Ejemplo de ActionListener
 Ensamblado:
1. JButton btnCancelar = new JButton(“Cancelar”);
2. btnCancelar.addActionListener( new CancelarListener() );
3. …

 Definición:
1. class CancelarListener implements ActionListener {
2. void actionPerformed(ActionEvent e) {
3. dialogo.setVisible(false);
4. }
5. }

Esp. Ing. César Omar Aranda 18

Ing. César Omar Aranda 9


Programación Avanzada
Universidad del Aconcagua

Objetos de Escucha
 Cada componente permite agregar un ActionListener que
está relacionado con el tipo del componente
 Por ejemplo, si a un botón se le agrega un ActionListener el
mismo es invocado cuando se oprime el botón ya sea con el
mouse o con el teclado.
 No es necesario definir KeyEvents o MouseEvents para esto.
 Los ActionListener se usan principalmente con botones y
menús. Aunque pueden usarse con otros tipos de
componentes.
 En un TextField el ActionListener es invocado cuando el cursor
sale del TextField.
 En las listas y tablas se utilizan listeners especiales
denominados SelectionListener
Esp. Ing. César Omar Aranda 19

Ejemplo: Listener con InnerClass


1. public class CounterView extends Frame {
2. private TextField tf = new TextField(10);
3. private Counter counter; // referencia al modelo
4. public CounterView(String title, Counter c) {
5. super(title); counter = c;
6. Panel tfPanel = new Panel();
7. ...
8. Button incButton = new Button("Increment");
9. incButton.addActionListener( new ActionListener() {
10. public void actionPerformed(ActionEvent e) {
11. counter.incCount();
12. tf.setText(counter.getCount() + "");
13. }
14. } );
15. buttonPanel.add(incButton); …

Esp. Ing. César Omar Aranda 20

Ing. César Omar Aranda 10


Programación Avanzada
Universidad del Aconcagua

Ejemplo de nuevo oyente de teclado

1. class EdadKeyListener implements KeyListener {


2. void keyTyped(KeyEvent e) {
3. char c = e.getKeyChar();
4. if (!Character.isDigit(c) {
5. // error, solo se permiten números
6. }
7. }

8. void keyPressed(KeyEvent e) { … }

9. void keyReleased(KeyEvent e) { … }
10. }
Esp. Ing. César Omar Aranda 21

Adaptadores
 Las clases Adapter implementan la interfaz correspondiente y
definen métodos vacíos
 Utilidad: no hay que implementar los métodos que no interesan, en
especial en aquellos casos en que la interfaz listener incluye más
de un método.
1. class EdadKeyListener extends KeyAdapter {
2. void keyTyped(KeyEvent e) {
3. char c = e.getKeyChar();
4. if (!Character.isDigit(c) {
5. // error, solo se permiten números
6. }}}

 Ensamblado
1. TextField edad = new TextField(3);
2. edad.addKeyListener( new EdadKeyListener() );
Esp. Ing. César Omar Aranda 22

Ing. César Omar Aranda 11


Programación Avanzada
Universidad del Aconcagua

Eventos, Oyentes y Adaptadores

Esp. Ing. César Omar Aranda 23

Analizando el Patrón Adapter


 También denominado Wrapper
 Tiene la finalidad de convertir la interfaz de una clase en
otra que el cliente espera. Permite la colaboración de
ciertas clases a pesar de tener interfaces incompatibles
 Patrón de tipo Estructural
 Resulta aplicable cuando:
 Se desea usar una clase existente (en ocasiones se trata de un
toolkit o librería de clases) y su interfaz no coincide (no es
compatible) con la que se necesita.
No se debe o puede cambiar la interfaz de la librería de clases.
 Se desea crear una clase reutilizable que debe colaborar con
clases no relacionadas o imprevistas.

Esp. Ing. César Omar Aranda 24

Ing. César Omar Aranda 12


Programación Avanzada
Universidad del Aconcagua

Estructura general
 Cliente: clase que
representa al objeto
que desea acceder
al comportamiento
según se presenta
en Objetivo.
 Objetivo: clase con
el tipo de interfaz
pública que se desea
usar.
 Adaptado: clase que contiene la definición del método concreto que
se desea usar y cuya interfaz pública no coincide con la usada por el
objeto Cliente
 Adaptador: clase que representa al objeto concreto al que accede el
cliente y que define el tipo y forma de la adaptación del método
existente en la clase Adaptado.
Esp. Ing. César Omar Aranda 25

Ejemplo Simple

Esp. Ing. César Omar Aranda 26

Ing. César Omar Aranda 13


Programación Avanzada
Universidad del Aconcagua

Ejemplo Simple en Java

27

Nuevos Observadores de Eventos (1)

 Si creamos dos instancias de CounterView para el mismo objeto


contador, ¿Qué debemos hacer para que un cambio en el valor
de contador en una de ellas afecte a la otra?

1. public class ObservableCounter extends Observable {


2. private int count;
3. public ObservableCounter(int count) { this.count = count; }
4. public int getCount() { return count; }
5. public void incCount() {
6. count++;
7. setChanged();
8. notifyObservers(); }
9. ... }

Esp. Ing. César Omar Aranda 28

Ing. César Omar Aranda 14


Programación Avanzada
Universidad del Aconcagua

Nuevos Observadores de Eventos (2)

public class ObservableCounterView extends Frame {


private ObservableCounter counter;
private TextField tf = new TextField(10);
public ObservableCounterView(String title,
ObservableCounter c) {
super(title); counter = c;
counter.addObserver(new Observer() {
public void update(Observable src, Object obj) {
if (src == counter) {
tf.setText(((ObservableCounter)src).getCount() + "");}
} } );
...

Esp. Ing. César Omar Aranda 29

Bibliografía
 Fundamental
 DEITEL, F. y DEITEL, H. (2008). Cómo programar en Java. 7ma edición,
Capítulo 11. Pearson Education.
 FROUFE QUINTAS, A. (2003). Java 2: Manual de usuario y tutorial. 3ra edición.
México: Alfaomega.
 ECKEL B. (2007). Piensa en Java. 4ª Edición. Capítulo 22. España: Prentice Hall.
Pearson Educación.
 GAMMA, E; HELM, R. y otros (2003). Patrones de Diseño. España: Addison-
Wesley. Pearson Education.
 Referencias complementarias
 http://pervasive2.morselli.unimo.it/~nicola/courses/IngegneriaDelSoftware/index.h
tml
 http://www.javaya.com.ar/index.php?inicio=20 (itemes 33 a 39)
 http://atobeto-eremita.blogspot.com.ar/2009/08/diseno-de-interfaces-graficas-en-
java.html
 http://www.publijuegos.com/

Esp. Ing. César Omar Aranda

Ing. César Omar Aranda 15

Potrebbero piacerti anche