Programación basada en/dirigida por eventos Event-Based Programming : Conceptos (o Event-driven Programming)

Documentos relacionados
Programación basada en eventos Event- Based Programming : Conceptos. ELO329: Diseño y Programación Orientados a Objetos

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

Intefaces gráficas. Eventos. Jose Jesus García Rueda

Pasos requeridos para establecer el manejo de eventos para un componente de GUI.

d) Mencione dos diferencias y dos semejanzas entre clases abstractas e interfaces.

Construir una Interfaz Gráfica

Programación de sistemas

Programación de Eventos

Ejemplo de GUI con Swing

Programación Java Curso C GUI

USO DE LOS OBJETOS JLABEL, JTEXTFIELD Y JBUTTON

PROGRAMACIÓN EN JAVA. { una línea para definir, crear o ejecutar ; }

Interfaces gráficas en Java GUIs Graphical User Interface

Java es un lenguaje orientado a objetos, por lo que los objetos (las clases) son los elementos más importantes en el diseño y desarrollo de una

INTERFAZ GRÁFICO DE USUARIO EVENTOS

I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein --Javier Navarro

Introducción a la Programación Orientada a Objetos

INGRESAR DATOS CON UN CONTROL VISUAL EN JAVA. CLASE JTEXTFIELD Y MÉTODO GETTEXT. EJEMPLOS (CU00928C)

1 Funcionalidades Java que se presentan en esta práctica

EVENTOS en Java generador de un evento gestor de eventos

Uso de Java Swing. Noviembre de 2013

Problema 1 (2 puntos)

Interacción con el Usuario Gestión de Eventos

Manejo de eventos AWT

Capítulo 3. Introducción a la programación. Continuar

Parte I: Programación en un lenguaje orientado a objetos

public void mousepressed(mouseevent evento) Se llama cuando se oprime un botón del ratón, mientras el cursor del ratón está sobre un componente.

Práctica 4. Interfaces Gráficas de Usuario Duración 1 sesión

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

Introducción a Java. Dr. (c) Noé Alejandro Castro Sánchez

Interfaces y Clases Internas

IC Programación Orientada a Objetos I. Programación de Interfaces Gráficas de Usuario (GUI) 2

Introducción a la Programación Orientada a Objetos

INSTRUCCIÓN PEDIR EN JAVA CON JTEXTAREA Y MOSTRAR CON JLABEL. SETBOUNDS Y SETTEXT. EJEMPLOS. (CU00929C)

1. Conceptos básicos de POO 1

EJERCICIO GUIADO. JAVA: DISEÑO DE FORMULARIOS DESDE CÓDIGO

Tema 6. Interfaces gráficas de usuario (Parte II Componentes y eventos)

Interfaces y Clases Internas. ELO329: Diseño y Programación Orientados a Objetos

Programación de sistemas

PLANTEL 2 CIEN METROS ELISA ACUÑA ROSSETTI ACADEMIA DE TECNOLOGIA DE LA INFORMACION Y DE LA COMUNICACION

Interfaces Gráficas de Usuario

USO DE LOS OBJETOS JLABEL, JTEXTFIELD Y JBUTTON

Ingeniería del Software Separación entre Presentación y Lógica del Negocio

Desarrollo de Aplicaciones en Java INF 473

Presentación del Curso Presencial. Programación en Java Nivel Básico

Programación de sistemas

Creemos una GUI para la siguiente tabla de la base de datos.

Programación Orientada a Objetos. Componentes Gráficos

Patricio Olivares. 25 de abril de 2017

Java Applets como ejemplo de Frameworks. Agustín J. González ELO-329

ALGORITMICA Y PROGRAMACION POR OBJETOS I

Interfaz Gráfica de Usuario (GUI)

Clases y herencia. FJP Unidad 8. Diseño de clases

INTERFACE COMPARATOR. DIFERENCIAS ENTRE COMPARATOR Y COMPARABLE. CLASE COLLECTIONS. EJERCICIOS RESUELTOS. (CU00918C)

Arquitecturas cliente/servidor

Programación Basada en Eventos

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Lenguajes de Programación Curso Práctica 8. Interfaces gráficas de usuario y Swing. Trabajo con modelos. 1. Un ejemplo 2. 2.

Desarrollo de Aplicaciones en Java INF 473

Capítulo 7. Introducción a las Interfaces Gráficas de usuario. Continuar

Programación de Interfaces Gráficas en Java

Agenda. Contenedores y componentes

GUIs en Java (4) Iván Alonso

EJERCICIO Y EJEMPLO RESUELTO: USO DE LA INTERFAZ CLONEABLE DE JAVA. MÉTODO CLONE() PARA CLONAR OBJETOS. (CU00912C)

GUÍA DE LABORATORIO 5 ARREGLOS DE UNA DIMENSIÓN

Creando archivos *.jar 2008

SWING. Universidad Nacional de Jujuy Analista Programador Universitario Año 2010 JTP: Jorge R. Mendoza

Estructuras de control selectivas

Tópicos Avanzados de Programación (TAP3501)

1. Guía de programación con jopas

1. Cómo hacer un applet? Implementación de un Applet (awt) Ejecución de los Applets Hacer el archivo HTML con los siguientes

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

Ingeniería en Desarrollo de Software 4 o semestre. Programa de la asignatura: Programación Orientada a Objetos II. Unidad 1. Eventos.

INTERFACE LIST. CLASE LINKEDLIST DEL API JAVA. EJERCICIO RESUELTO Y DIFERENCIAS ENTRE ARRAYLIST Y LINKEDLIST (CU00921C)

Práctica 2: Java Remote Method Invocation (RMI)

Código Fuente. Creamos en C:\ una carpeta para ubicar el código fuente del servidor. En mi caso, he creado una carpeta denominada rmi4

Transcripción:

Programación basada en/dirigida por eventos Event-Based Programming : Conceptos (o Event-driven Programming) ELO329: Diseño y Programación Orientados a Objetos

Nuevo paradigma de programación En la programación basada en eventos (o programación dirigida por eventos) el flujo del programa está determinado por eventos; por ejemplo, salidas de un sensor, eventos de usuario (mouse, teclado), mensajes desde otros programas, etc. También puede ser definida como una técnica para estructurar aplicaciones en donde la aplicación tiene un loop principal que se divide en dos secciones: Selección o detección de evento Manejo o reacción frente al evento Inicialización; Forever do { Detecte la llegada de un evento; Ejecute acción definida para ese evento; }

Nuevo paradigma de programación En sistemas embebidos (micro-procesadores / microcontroladores, etc) se implementa este modelo usando interrupciones en lugar de correr un loop infinito. Programas basados en eventos pueden ser escritos en cualquier lenguaje pero esta tarea se facilita en los lenguajes que proveen abstracciones de alto nivel. En Java el loop infinito lo proporciona el ambiente gráfico de Java. Nosotros sólo registramos el código a ejecutar ante un evento de interés.

Uso de programación de eventos en GUIs Este modelo tiene gran aplicación en la programación de interfaces gráficas de usuarios. Los programas de consolas típicos siguen un flujo secuencial en 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 algún scrollbar. Cómo podemos estar atentos a tantas cosas al mismo tiempo? La GUI del programa debe responder bien a todos estos eventos.

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 eventos causados por la GUI. La API de Java tiene interfaces (listeners) que deben ser implementadas por las clases que manejan los eventos posibles. Los métodos de la interfaz ( equivalen a las rutinas de servicio de interrupción ) son llamados cuando un evento específico ocurre.

Pasos para programar respuestas a Eventos Configuración para reaccionar ante un evento Algún Objeto new Listener() registrar(listener) Listener Componente Gráfica Método asociado (datos del evento) Se produce el evento, lo detecta el loop infinito que no vemos Los listener son instancias de un clase definida por el usuario. Esta clase implementa los métodos definidos por una Interfaz (estos métodos equivalen a las rutinas de atención de Interrupción ). Las componentes gráficas y los datos del evento son definidos por Java.

Ejemplo Veamos el caso de una ventana de nivel superior en Java (aquellas que se pueden mover libremente en la pantalla - desktop) CloseableFrame.java import java.awt.event.*; import javax.swing.*; class CloseableFrame extends JFrame { public CloseableFrame() { settitle("my Closeable Frame"); setsize( 300, 200); // Creamos y rgistramos el objeto que se hará // cargo de atender los eventos de la ventana MyWindowListener listener = new MyWindowListener(); addwindowlistener(listener); } } // continúa en próxima lámina

Ejemplo (continuación) class MyWindowListener implements WindowListener { // Do nothing methods required by interface public void windowactivated( WindowEvent e) {} OJO: una opción public void windowdeactivated( WindowEvent e) {} habría sido declarar public void windowiconified( WindowEvent e) {} esta clase como public void windowdeiconified( WindowEvent e) {} interna a Closeable. public void windowopened( WindowEvent e) {} Pudo ser anónima. 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); // make the frame visible } // here the program does not end, it enters the infinite loop. } // beacuse we create a graphics object, a JFrame.

Relación estática de clases (generada con Jprasp)

Diagrama de secuencia para creación de ventana Muestra la dinámica al crear una ventana. JVM inicia main Main: Main New f : CloseableFrame Objeto:Clase new listener :MyWindowListener addwindowlistener setvisible(true)

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. Una instancia de MyWindowListener es registrada con addwindowlistener (es como configurar quien atenderá los eventos de la ventana). Cuando el evento ocurre, la máquina virtual Java lo detecta y verifica si hay listeners esperando por ese evento. Si los hay, automáticamente llama al método apropiado de la interfaz WindowListener según el evento ocurrido. 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 mucho. Veremos otro ejemplo.

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

Diagrama de Clases de SimpleMimic Generado con Jgrasp Este diagrama puede ser completado con las clases usadas del JDK.

Diagrama de Clases de SimpleMimic Generado con Jgrasp, con clases del JDK

Diagrama de secuencia Situación: Creación de listener (manejador del evento) y su registro. mimic :SimpleMimic new Se crea listener gui :SimpleMimicGUI new addactionlistener quote :JTextField Se registra Se espera que este tipo de diagramas puedan ser hechos antes de escribir el código (alguien experimentado). La experiencia ayuda a imaginar este tipo de interacciones que luego son reflejadas en el código.

Diagrama de secuencia Situación (caso de uso): Usuario ingresa nuevo texto. Esto gatilla el evento esperado. Gui :ActionListener Usuario ingresa texto actionperformed La JVM lo detecta, gettext avisa a la componente Gráfica y ésta envía settext Mensaje al listener (En realidad ejecuta el método asociado) Quote :JTextField Label :JLabel Es recomendable tener bien clara esta interacción de objetos. Este diagrama sirve además como documentación. JTextField y JLabel pertenecen a la API, luego sólo hay que escribir el código para las otras tres clases.

Entrada en Campo de texto: versión 2 Esta versión separa roles -Panel y listener-, para este problema simple probablemente no se justifica. La idea es explorar otras situaciones posibles. Ver Mimic.java

Diagrama de Clases de Mimic.java

Diagrama de secuencia Caso de uso: Ingreso de nuevo texto. Esto gatilla el evento esperado. Usuario ingresa texto actionperformed Listener :MimicListener updatelabel Gui :MimicGUI gettext Quote :JTextField Label :JLabel settext En SimpleGui, lister y Gui eran un sólo objeto. Ambos caminos son OK.

Explicación 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 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 el objeto JTextField, el cual se entera 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.

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í distinguir 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 MimicCharbyChar.java