You are on page 1of 20

Programacin basada en eventos EventBased Programming: Conceptos

ELO329: Diseo y Programacin Orientados a Objetos

Nuevo paradigma de programacin


En la programacin basada en eventos (o programacin dirigida por eventos) el flujo del programa est determinado por eventos como salidas de un sensor, eventos Paradigmas dede usurio programacin (mouse, teclado), mensajes desde otros programas, etc.
Programacin Imperativa Programacin basada en eventos

Programacin Declarativa

Por procedimientos

Orientada a Objetos

Introduccin
Este tema tiene su aparicin en la programacin de interfaces grficas de usuarios. Los programas de consolas tpicos siguen un flujo secuencial en el que tpicamente se tienen ciclos:
entrada->procesamiento->salida

Cuando programamos una Interfaz Grfica de Usuario (GUI: Graphics User Interface) debemos tomar en cuenta la variedad de posibles interacciones con el usuario. ELO-329: Diseo y Programacin Orientados a Objetos En lugar de un nico flujo de entrada de datos

Modelo
Una forma de manejar todo tipo de posibles interacciones de usuarios es el uso de interrupciones. De esta manera la CPU no pierde tiempo mirando los posibles eventos de usuarios, sino simplemente responde al evento y reanuda su procesamiento normal (otras tareas). Comnmente, lenguajes de programacin no dan acceso directo a eventos asincrnicos. Lenguajes como Java nos permiten definir y manejar interrupciones o eventos por software. ELO-329: Diseo y Programacin Orientados a Objetos La API de Java permite a los programadores

Pasos para programar respuestas a Eventos


Algn Objeto
Se ve necesidad de reaccionar ante un evento

Listener

Componente Grfica

registrar(listener)

Mtodo asociado(datos del evento)

Se produce el evento

Los listener son instancias de las clases definidas por el usuario y que implementan los mtodos definidos por la Interfaz (estos mtodos equivalen a las rutinas de atencin de Interrupcin ). ELO-329: Diseo y Programacin Orientados a Objetos Las componentes grficas y los datos del

Ejemplo
Veamos el caso de una ventana de nivel superior en Java (aquellas que se pueden mover libremente en el desktop) CloseableFrame.java import java.awt.event.*; import javax.swing.*; class CloseableFrame extends JFrame { public CloseableFrame() { setTitle("My Closeable Frame"); setSize( 300, 200); ELO-329: Diseo yel Programacin Orientados a Objetos se har cargo // Registramos objeto que

Ejemplo (continuacin)
class MyWindowListener implements OJO: una opcin WindowListener { habra sido declarar // Do nothing methods required by esta clase como interna a Closeable. interface Pudo ser annima. public void windowActivated( WindowEvent e) {} public void windowDeactivated( WindowEvent e) {} public void windowIconified( WindowEvent e) {} public void windowDeiconified( ELO-329: Diseo y Programacin WindowEvent e) {} Orientados a Objetos

Relacin esttica de clases (generada con Jprasp)

ELO-329: Diseo y Programacin Orientados a Objetos

Diagrama de secuencia para creacin de ventana Muestra la dinmica al crear una ventana.
Main: Main JVM inicia main
New
Objeto:Clase

f : CloseableFrame
new
listener :MyWindowListener

addWindowListener

show

ELO-329: Diseo y Programacin Orientados a Objetos

Explicacin
Objetos en la clase CloseableFrame causan que una ventana aparezca en la pantalla del usuario. La aplicacin puede crear tantas ventanas como lo desee creando mltiples objetos CloseableFrame. Una instancia de MyWindowListener es registrada con addWindowListener (es como configurar quien atender las interrupciones). Cuando el evento ocurre, la mquina virtual Java lo detecta y verifica si hay listeners esperando por ese evento. Si los hay, automticamente llama al mtodo apropiado de la interfaz WindowListener. La interfaz WindowListener es implementada por la clase MyWindowListener, as su instancia puede responder a los eventos de la ventana en la cual l fue registrado. Hay siete mtodos en la Interfaz WindowListener (Ver API). Aqu slo nos interesamos por el evento cierre de ventana. La mayora de las otras interfaces para eventos no difieren mucho. ELO-329: Diseo y Programacin Orientados a Objetos Veremos otro ejemplo.

Entrada en Campo de texto


Supongamos que queremos leer lo ingresado en un campo de texto y luego copiarlo en un label (rtulo). Ver SimpleMimic.java

ELO-329: Diseo y Programacin Orientados a Objetos

Diagrama de Clases de SimpleMimic


Generado con Jgrasp

Este diagrama puede ser completado con las clases usadas del JDK.
ELO-329: Diseo y Programacin Orientados a Objetos

Diagrama de Clases de SimpleMimic


Generado con Jgrasp, con clases del JDK

ELO-329: Diseo y Programacin Orientados a Objetos

Diagrama de secuencia
Situacin: Creacin de listener y su registro.
mimic :SimpleMimic new

Se crea listener gui :SimpleMimicGUI new

quote :JTextField

Se registra

addActionListener

Se espera que este tipo de diagramas puedan


ELO-329: Diseo y Programacin Orientados a Objetos

Diagrama de secuencia
Situacin (caso de uso): Usuario ingresa nuevo Gui texto. Esto gatilla el evento esperado. Quote Label
:ActionListener

Usuario actionPerformed ingresa texto La JVM lo detecta, avisa a la componente Grfica y sta enva Mensaje al listener

:JTextField

:JLabel

getText

setText

ELO-329: Diseo y Programacin Orientados a Objetos

Entrada en Campo de texto: versin 2


Esta versin separa roles, para este problema simple probablemente no se justifica. La idea es explorar otras situaciones posibles. Ver Mimic.java

ELO-329: Diseo y Programacin Orientados a Objetos

Diagrama de Clases de Mimic.java

ELO-329: Diseo y Programacin Orientados a Objetos

Diagrama de secuencia
Caso de uso: Ingreso de nuevo texto. Esto gatilla el evento esperado.
Listener :MimicListener
Gui :MimicGUI Quote :JTextField Label :JLabel

Usuario ingresa texto

actionPerformed updateLabel

getText
setText

ELO-329: Diseo y Programacin Orientados a Objetos

Explicacin del ejemplo


El listener es registrado con el objeto quote de la clase JTextField en el constructor MimicGUI() al ejecutar quote.addActionListener(listener). Cuando listener es registrado, ste es agregado a una lista interna que mantiene los objetos que deben ser notificados cuando ocurre un evento. Podemos tener ms de un listener registrado por evento. Cuando el evento ocurre (por ejemplo, presionamos return en la ventana), el mtodo listener.actionPerformed(ActionEvent event) es llamado por el objeto JtextField, el cual se entera por la JVM. Notar que los datos sobre el evento son pasados al mtodo va el parmetro.

El cdigo en el mtodo del listener maneja el evento llamando a gui.updateLabel(), el cual hace eco del contenido del campo ELO-329: Diseo y Programacin Orientados a Objetos texto en el rtulo puesto en la ventana.

Algunas recomendaciones
No es estrictamente necesario poner la descripcin de las componentes de la GUI en una clase separada, pero es buena idea. Incluso puede ser conveniente ponerlas en una archivo separado para as separar la presentacin e interaccin con el usuario del procesamiento o clculo interno. La clase JTextField es incluso ms completa. Nos permite recibir una notificacin cada vez que un caracter es ingresado. Los cambios requeridos para ello se muestras ELO-329: Diseo y Programacin Orientados a Objetos en MimicCharbyChar.java

You might also like