Aptec101 s8 Programacioneventos
Aptec101 s8 Programacioneventos
Orientada a Eventos
1. INTRODUCCIÓN Pág. 2
1
Programación orientada a eventos
1. INTRODUCCIÓN
Figura 1.1 2
Diagrama de conocimientos e integración de la POO y POE de este curso.
Programación orientada a eventos
Primero, en este apunte, entregaremos los conceptos de la POE y las diferencias con
otros paradigmas, especialmente con la POO. A continuación, implementaremos la
interfaz de usuario como una componente que alberga una serie de componentes
visuales presentados al usuario. Es necesario que conozcas las más importantes para
que puedas implementar tus propias GUI. Finalmente, revisaremos cómo se integran
estas componentes GUI con el modelo de clases a través de los controladores de
gestión de eventos.
3
Programación orientada a eventos
definir algunos de los conceptos principales de POE y luego los relacionaremos con lo
que has aprendido en POO usando un ejemplo específico.
5
EJEMPLO DE CREACIÓN DE UNA GUI SIMPLE PARA RELACIONARLA CON LA
POO
La figura 2.1 es un ejemplo simple de una pantalla (o formulario) para que el usuario
interactúe ingresando números que se van acumulando y mostrando el resultado en
el campo donde dice total.
Figura 2.1
Ejemplo de un objeto formulario o ventana de interacción con el usuario.
Programación orientada a eventos
Bueno, tienes que saber que esta pantalla es un objeto que fue instanciado por una
clase creada por nosotros (que la llamaremos VistaSumadorImp), donde sus
atributos y su constructor se definieron de la siguiente forma:
6
Los atributos (o componentes botonSumar, txtValor, etc.) de esta clase son
también objetos que referencian a otras clases que ya se encuentran definidas en
una biblioteca de Java para trabajar con ellas. Las clases que están referenciando
estos atributos son:
• JButton
• JTextField
• JLabel
Por lo tanto, estas componentes que referencian a dichas clases pueden usar todos
los métodos que se encuentran definidos en la biblioteca Java y que te servirán para
darle a tu pantalla el aspecto y la funcionalidad requerida. Entonces, para el ejemplo
podemos definir un diagrama de clases como el siguiente:
Programación orientada a eventos
Figura 2.3
Diagrama de Clases para implementar el ejemplo de la figura 2.1.
Figura 2.4
Programa main para crear y generar aspectos visuales del ejemplo
Los objetos vista y acum se crean como lo hemos aprendido hasta ahora, solo debes
tener cuidado de crear un objeto JFrame para alojar allí nuestra pantalla. Recuerda
que al crear el objeto vista de la clase VistaSumadorImp, este constructor también
crea los objetos botonSumar, txtTotal, txtValor, etc. por la relación compuesta que
existe entre ellos. El método crearGUI permite dar el aspecto requerido a mi pantalla
gracias a la API que nos provee Java a través de los objetos que hemos creado
(ventana, botonSumar, txtValor, etc.).
8
Te dejo la programación de la clase VistaSumadorImpl para que veas cómo se
implementó el método crearGUI y conozcas las clases que se importaron de la API
con la ejecución de algunos de sus métodos.
Programación orientada a eventos
Figura 2.5
Programa de la clase VistaSumadorImpl del ejemplo 2.1.
Figura 2.6
Estructura de Clases para el ejemplo de la figura 2.1.
Figura 2.7
Salida al ejecutar el programa main de la figura 2.4
10
AWT (Abstract Windows Toolkit) es la parte de Java que se emplea para construir
interfaces gráficas de usuario. Este paquete ha estado presente desde la primera
versión, en la versión 1.2 se incorporó una librería adicional, JFC Swing, que
enriquece a AWT en la construcción de aplicaciones gráficas. No hay mucha diferencia
en la estructura entre los controles proporcionados por AWT y los proporcionados por
Swing. Estos se llaman, en general, igual que los primeros, salvo que tienen una "J"
delante; así, por ejemplo, la clase Button de AWT pasa a llamarse JButton en Swing,
y en general la estructura del paquete de Swing (javax.swing) es la misma que la
que tiene AWT (java.awt).
Componentes:
Los componentes son los elementos visuales de una GUI. Considere lo siguiente:
• Cada elemento gráfico de GUI es un componente.
• Cada componente es una instancia (un objeto) de una clase.
• Un componente se crea como cualquier otro objeto Java.
• Botones (JButton), etiquetas (JLabel), campos de texto (JTextField), son
ejemplos y componentes. 11
• Se sitúan dentro de algún contenedor (componente especializado).
Contenedores:
Figura 2.8
Jerarquía de contenedores superiores de AWT y Java Swing para interfaces
gráficas.
12
a) Contenedores intermedios: almacenan componentes y contenedores
intermedios (JPanel, JScrollPane, JSplitPane, JTabbedPane, etc.).
• permiten organizar la estructura y composición de las vistas.
• Contienen a los componentes y a otros contenedores, permitiendo
construir jerarquías de componentes.
• La jerarquía de clases de contenedores intermedios es la siguiente:
Programación orientada a eventos
Figura 2.9
Jerarquía de contenedores intermedios AWT y Java Swing para interfaces gráfica.
Figura 2.10
Jerarquía de componentes Java Swing NO contenedores para interfaces gráfica.
Programación orientada a eventos
Figura 2.11
Ejemplo de disposición de componentes para una interfaz de usuario
Gestores de Esquemas:
Los gestores de esquemas son clases que determinan cómo se distribuirán los
componentes dentro de un contenedor intermedio. La mayoría de los gestores de
esquemas están definidos en java.awt. Algunos son:
• FlowLayout: organiza los componentes según un flujo direccional. Con el
gestor de esquemas java.awt.FlowLayout, los componentes fluyen de
izquierda a derecha y de arriba a abajo. Al cambiar el tamaño de la ventana,
puede cambiar la disposición de los componentes.
15
• BoxLayout: organiza los componentes horizontalmente o verticalmente. Con
el gestor de esquemas java.awt.BoxLayout, los componentes se distribuyen
horizontal o verticalmente.
16
• GridLayout: organiza los componentes según una cuadrícula. Con el gestor
de esquemas java.awt.GridLayout, el contenedor se divide en una cuadrícula
con tantas filas y columnas como se especifique en el constructor.
setLayout(new GridLayout(2, 3)); // Dos filas y tres columnas
• Los componentes se mantienen de igual tamaño dentro de cada celda.
• El orden a la hora de agregar los componentes determina la posición
que ocupan (de izquierda a derecha y de arriba a abajo).
17
Programación orientada a eventos
Figura 3.1
Representación Escuchador ejecuta comportamientos en función del evento notificado.
18
Figura 3.2
Gestión Eventos Java usando patrón de diseño Observador (Listener) – Observable (Source)
Por lo tanto, la clase de eventos que debes importar para este caso es
javax.swing.event.ActionEvent y el escuchador que debes elegir para
programar es la interfaz ActionListener. El nombre de la clase de un evento
tiene el formato XxxxxEvent (según el tipo de evento), lo mismo sucede con el
nombre de la interfaz del escuchador que tiene formato XxxxxListener.
Para conocer los eventos que lanzan las distintas componentes puedes consultar:
https://docs.oracle.com/javase/tutorial/uiswing/events/eventsandcomponents.h
tml
Programación orientada a eventos
20
Programación orientada a eventos
componente.addActionListener(controlador);
Figura 3.3
Diseño ejercicio figura 2.1 usando patrón de diseño Observador– Observable
Programación orientada a eventos
Por lo tanto, la dificultad respecto a lo que has aprendido hasta ahora es identificar
correctamente el evento para poder programar el método correspondiente. Te dejo
los principales para que los vayas conociendo.
Figura 3.4
Jerarquía de eventos asociados a componentes GUI Java.
23
Programación orientada a eventos
Sabemos que cada objeto (observable) genera un tipo específico de evento que debe
ser representada con su clase adecuada.
Son clases que deben representar los tipos de eventos que escuchan, estas clases
deben implementar una o varias interfaces para ejecutar métodos de acuerdo al tipo
de evento.
24
Sin embargo, la mayoría de interfaces tienen más de un método que tal vez no debas
usar. Debido a este motivo han creado una serie de clases adaptadoras encargadas
de cumplir la misma función, pero la ventaja es que solo usas los métodos que
necesites (son clases que ya implementan las interfaces mencionadas anteriormente
y estas también se utilizan para crear oyentes).
Programación orientada a eventos
25
Programación orientada a eventos
La idea básica de este patrón es agrupar las clases según tres roles:
• Modelo: este rol lo juegan todas las clases responsables de mantener y
gestionar los datos de nuestra aplicación.
• Vista: este rol lo juegan todas las clases responsables de visualizar datos.
• Controlador: conecta la Vista con el Modelo. También conectado con la
dinámica de la aplicación.
Figura 4.1
Interacción entre las componentes Modelo, Vista y Controlador del patrón MVC
26
Imagina que estás desarrollando una aplicación para gestionar tus gastos.
• La Vista es la responsable de mostrar la información gráficamente.
• El Modelo mantiene los datos de tus gastos.
• El Controlador realiza cambios en el Modelo cuando el usuario interacciona
con la Vista.
Ventajas:
• La principal ventaja de este patrón es que se ha desacoplado el modelo de
datos y su visualización.
• Puedo cambiar el aspecto de la Vista sin necesidad de modificar el Modelo.
Ejemplo: si tenemos una aplicación que muestra los datos del Modelo en
forma de gráfico de dos dimensiones, podríamos reemplazar el gráfico, o
añadir, además, una visualización de los datos en una tabla. Puedo, incluso,
tener más de una Vista del mismo Modelo.
• Puedo cambiar el Modelo sin modificar la Vista. Los datos de
mi Modelo pueden estar en un simple fichero de texto, pero en el momento
en que necesite utilizar una BD, cambiaré solo el Modelo. Nunca será
necesario cambiar además la Vista.
Programación orientada a eventos
Para nuestro ejemplo (de la figura 2.1) vamos a aplicar MVC considerando el
diagrama siguiente (figura 4.1). La principal diferencia con lo que teníamos
(comparar con figura 3.3) es la independencia que le hemos dado a la componente
vista, no referenciando directamente a la clase concreta VistaSumadorImpl. Para
acceder esta clase se debe realizar a través de la interface Vista.
Figura 4.1
Aplicación del patrón MVC al ejemplo del Sumador de números.
27
Programación orientada a eventos
5. CASO PROPUESTO
Se propone un caso sencillo donde debe implementar la gestión del saldo de una
cuenta vista con las 3 posibles operaciones:
• void depositar(double): ingresar dinero a la cuenta.
28
• double extraer(double): extraer dinero de la cuenta.
• double consultarSaldo(): consultar el saldo.
Reglas de negocio:
• Al instanciar una cuenta esta debe ser abierta con un saldo mínimo de 2 UTM
y el titular debe ser mayor de edad.
• El usuario no puede sacar más dinero de lo que tiene disponible.
• Cada vez que se realiza un giro debe descontar el 1% de lo que tenga en la
cuenta antes de concretar la extracción del dinero.
Se solicita lo siguiente:
• Diseña el caso realizando un diagrama de clases considerando el patrón de
diseño Modelo Vista Controlador (MVC). Súbelo al foro para que tus
compañeros y docente lo discutamos.
• Dibuja la interfaz con la que interactúa el usuario antes de programarla.
Súbela al foro también.
• Programa esta aplicación usando componentes MVC.