• No se han encontrado resultados

Programación Conducida por eventos Event-driven programming. Agustín J. González ELO329/ELO330

N/A
N/A
Protected

Academic year: 2021

Share "Programación Conducida por eventos Event-driven programming. Agustín J. González ELO329/ELO330"

Copied!
14
0
0

Texto completo

(1)

1

Programación “Conducida por eventos”

Event-driven programming

Agustín J. González

ELO329/ELO330

(2)

2

Introducción

 Este tema tiene su aparición en la programación de interfaces

gráficas de usuarios.

 Los programas de consolas típicos siguen un flujo secuencial en

el que típicamente se tienen ciclos:

 entrada->procesamiento->salida

 Cuando programamos una Interfaz Gráfica de Usuario (GUI:

Graphics User Interface) debemos tomar en cuenta la variedad de posibles interacciones con el usuario.

 En lugar de un único flujo de entrada de datos por consola, las

GUIs permiten muchas más acciones del usuario.

 Por ejemplo: es posible presionar botones gráficos, escribir

texto en un campo de texto, o mover alguna scrollbar.

 ¿Cómo podemos estar atento a tantas cosas al mismo

tiempo?

 La GUI del programa debe responder bien a todos estos

(3)

3

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).

 Comúnmente, lenguajes de programación no dan acceso directo a

eventos asincrónicos.

 Lenguajes como Java nos permiten definir y manejar

interrupciones o eventos por software.

 La API de Java permite a los programadores crear clases de

objetos, llamados listeners, que responden a interrupciones causadas por la GUI.

 La API de Java tiene interfaces que deben ser implementadas

por las clases listener.

 Los métodos de la interfaz (“equivale a la rutina de servicio de

(4)

4

Pasos para programar respuestas a

Eventos

Los listener son instancias de las clases definidas por el

usuario y que implementan los métodos definidos por la Interfaz (estos métodos equivalen a “las rutinas de atención de

Interrupción” ).

 Las componentes gráficas y los datos del evento son objetos de

las clases de Java.

Componente Gráfica Métodos add/remove de listeners Listener Métodos de atención de eventos Objeto con Datos del evento

Paso 1

Registrar listener

Paso 2

Ocurrencia del evento gatilla invocación del método asociado al evento (run-time)

(5)

5

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);

// Registramos el objeto que se hará cargo // de atender los eventos de la ventana

addWindowListener( new MyWindowListener()); }

(6)

6

Ejemplo (continuación)

class MyWindowListener implements WindowListener {

// Do nothing methods required by interface

public void windowActivated( WindowEvent e) {} public void windowDeactivated( WindowEvent e) {} public void windowIconified( WindowEvent e) {} public void windowDeiconified( WindowEvent e) {} public void windowOpened( WindowEvent e) {} public void windowClosed( WindowEvent e) {}

// override windowClosing method to exit program public void windowClosing( WindowEvent e) {

System.exit( 0); // normal exit }

}

class Main {

public static void main( String[] args) {

CloseableFrame f = new CloseableFrame();

f.setVisible(true); // makes the frame visible }

(7)

7

(8)

8

Diagrama de secuencia para creación de

ventana

Main

CloseableFrame

MyWindowListener

JVM inicia

main CloseableFrame

show

addWindowListener

MyWindowListener

(9)

9

Explicación

 Objetos en la clase CloseableFrame causan que una ventana

aparezca en la pantalla del usuario. La aplicación puede crear tantas ventanas como lo desee creando múltiples objetos

CloseableFrame.

 Un objeto MyWindowListener es registrado con

addWindowLister (es como configurar quien atenderá las interrupciones). Cuando el evento ocurre, la máquina virtual Java lo detecta y verifica si hay listeners esperando por ese

evento. Si los hay, llama automáticamente al método 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 métodos en la Interfaz WindowListener (Ver API) Aquí

sólo nos interesamos por el evento cierre de ventana.

 La mayoría de las otras interfaces para eventos no difieren

(10)

10

Entrada en Campo de texto

Supongamos que queremos leer lo ingresado

en un campo de texto y luego copiarlo en un

label (rótulo).

(11)

11

(12)

12

Diagrama de secuencia:

 Caso de uso: Ingreso de nuevo texto.

 Es recomendable tener bien clara esta relación, y ayuda hacer

este dibujo antes de hacer el código. Sirve además como documentación.

 JtextField y Jlabel pertenecen al API, luego sólo hay que escribir

el código para las otras tres clases.

MimicListener MimicGUI JTextField JLabel

Usuario ingresa texto actionPerformed updateLabel getText setText

(13)

13

Explicación del ejemplo

 El listener es registrado con el objeto quote – comillas - 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 un evento ocurre. Podemos tener más de un listener registrado por evento.

 Cuando el evento ocurre (por ejemplo, presionamos return en la

ventana), el método listener.actionPerformed(ActionEvent event) es llamado por la JVM. Notar que los datos sobre el evento son pasados al método vía el parámetro.

 El código en el método del listener maneja el evento llamando a

gui.updateLabel(), el cual hace eco del contenido del campo texto en el rótulo puesto en la ventana.

(14)

14

Algunas recomendaciones

No es estrictamente necesario poner la descripción

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

presentación e interacción con el usuario del

procesamiento o cálculo interno.

La clase JTextField es incluso más completa. Nos

permite recibir una notificación cada vez que un

caracter es ingresado.

Los cambios requeridos para ello se muestras en

Referencias

Documento similar

Objetivo general: Entender y proporcionar información referente al pasado con el fin de compartir anécdotas personales, narrar historias simples y sucesos que

El desarrollo de CEP4Tsunami ha sido posible gracias al uso de las siguientes tecno- log´ıas: (1) Siddhi, un motor CEP para el procesamiento de eventos complejos, utilizado para

Además gracias a los informes socioeconómicos de los diferentes perfiles de cliente y por lo tanto de la imagen mental que se crea, conocemos al cliente que quiere asistir

El festival de cine Fajr puede ir acompañado de una exposición, al igual que muchos festivales que se desarrollan en todo el mundo como festival de Cine de Zúrich, Venecia e

mientras que al utilizar un modelo individual entrenamos un único modelo sobre un único conjunto de datos, en un modelo de ensemble stacking hay varias capas de modelos y los modelos

Este proyecto tiene como objetivo desarrollar una aplicación que de a conocer la Universidad Politécnica de Cartagena, concretamente la Escuela Técnica Superior de Ingeniería

Resulta revelador el hecho de que, a pesar de que la natu- raleza de estos campos es heterogénea, la obra de Xenakis se concibe como un único ensamblaje dinámico de todos ellos:

Particularmente, se han implementado paso a paso y para un mismo cuerpo, los 3 métodos de representación gráfica para la obtención de una perspectiva axonométrica