Programación basada en eventos
Tipos de programas en Java
• Aplicaciones
• Se pueden ejecutar directamente en un entorno Java
• Tipos
• Pequeñas aplicaciones que se ejecutan dentro de un navegador
(o en el visualizador de applets - Appletviewer)
❏ Interfaz gráfico
❏ Limitaciones por motivos de seguridad
❏ Modo de consola
❏ Aplicaciones con interfaz gráfico (GUI)
-Interacción mediante teclado
-Interfaz basado en texto
-Ventanas graficas para entrada y salida de datos
-Iconos
-Dispositivos de entrada (e.g. ratón, teclado)
-Interacción directa
• Applets
Java
1
Java
Creación de una interfaz gráfico de usuario
• Composición de la interfaz gráfica de la aplicación (GUI)
• Elección de un contenedor (ventana) en la que se incluyen el
resto de los elementos gráficos de interacción
• Diseño del interfaz gráfico añadiendo componentes gráficos
de interacción (p.e. Botones, etiquetas, menús, ...)
• Establecer los gestores de eventos para responder a las
interacciones de los usuarios con la interfaz gráfica
• Visualizar la interfaz gráfica
•
Java lanza un hilo que se encarga de gestionar la interacción
del usuario con la interfaz gráfica,
por tanto el método principal puede acabar después de haberse creado
y visualizado la interfaz
Programación basada en eventos
• Eventos o sucesos
• Mensajes asíncronos producidos por interacción
❏ Interacción del usuario con la interfaz gráfica de un programa
-Ejemplo:
Interacción con el ratón (hacer click, arrastrar, mover, etc)
Introducir texto en un determinado campo
• Estos mensajes son objetos
• La programación basada en eventos consiste en
proporcionar métodos que respondan a dichos mensajes
Java
3
Java
2
4
❏
Modelo de evento Java 1.0
• Basado en herencia
• Un programa gestiona el tratamiento de eventos de un GUI
• Especializando componentes del GUI y reescribiendo los
métodos action() o handleEvent()
❏ Devuelve true --> evento tratado
❏ Devuelve false --> el evento se propaga hacia arriba en la jerarquía
• Estructuración del código
• Cada componente se especializa para que gestione sus eventos
❏ Muchas clases muy pequeñas
• Todos los eventos de un grupo de componentes se tratan en un
componente que los contenga
❏ Los métodos action() o handleEvent() del componente contenedor debe
tener una instrucción de selección para determinar a que elemento
corresponde
Java
5
Java
• Muchas posibilidades de error
• No hay filtrado de eventos
❏ Problemas de eficiencia
Modelo de evento Java 1.0 - Problemas
• Muy complejo para interfaces con muchas funcionalidades
• Poco escalable
interfaz (GUI)
• No permite una separación clara entre la aplicación y la
• Todos los eventos se tratan mediante los mismos métodos
Modelo de evento Java 1.1
• Objetivos de diseño
• Simple y fácil de aprender a la vez que versátil
• Permite una separación clara entre el código de la aplicación y
el de la interfaz
• Facilita la creación de código robusto para la gestión de
eventos
• Soporte en ejecución para las herramientas visuales
❏ Eventos generados
❏ Eventos tratados
Modelo de delegación
• Delegación
• La responsabilidad de gestionar un evento, que ocurre en un
objeto (fuente), la tiene otro objeto (oyente)
• Eventos
• Eventos representados como objetos en una jerarquía de clases
❏ Una subclase para cada evento o tipo de eventos relacionados
❏ Estos objetos encapsulan toda la información del evento
-El tipo de evento, por ejemplo, pulsar el ratón
-El objeto fuente sobre el que se produjo el evento (e.g. un botón)
-El instante de tiempo en el que se produjo el evento
-La posición (x, y) donde se produjo el evento
-La tecla que se pulsó (para eventos de teclado)
-El estado de las teclas modificadoras (CTRL, SHIFT, ...) presionadas o no por el
usuario cuando sucedió el evento
• Propagación de eventos de una fuente a un oyente
❏ Invocación desde la fuente de un método del oyente pasándole el objeto
que define el tipo de evento generado
Java
7
Java
6
8
Fuentes y Oyentes
• Fuente (Source)
• Objeto que origina o lanza eventos
❏ En el API de cada objeto se define el conjunto de eventos que origina
• Proporciona un conjunto de métodos para registrar y eliminar
oyentes específicos para estos eventos
❏ set<TipoEvento>Listener - un único oyente
❏ add<TipoEvento>Listener - múltiples oyentes
❏ remove<TipoEvento>Listener - elimina un oyente
• Oyente (Listener)
• Objeto que gestiona o responde a los eventos
• Define uno o más métodos a ser invocados por la fuente de
eventos en respuesta a cada evento específico
• Objeto que implementa el interfaz <TipoEvento>Listener
Uso del modelo
• Los objetos que desean gestionar los eventos y recibir
dichas notificaciones tienen que registrarse como oyentes
e implementar los métodos de la interfaz correspondiente
• Cuando ocurre un evento la fuente informa a los oyentes
registrados invocando a dichos métodos (callback)
• En un programa Swing, normalmente la fuente de eventos
es un componente GUI y el oyente es un objeto
“adaptador” que implementa el o los oyentes adecuados
para que la aplicación gestione los eventos
• El oyente también puede ser otro componente Swing que
implementa uno o más interfaces oyentes para agrupar
objetos del GUI
Java
9
Java
Jerarquía de clases de eventos
• Cada clase representa un tipo de evento o un grupo de
eventos relacionados
• Una clase puede representar varios tipos de eventos
❏ MouseEvent: mouse up, mouse down, mouse drag, mouse move
• Raíz de la jerarquía
java.util.EventObject
• Los programas pueden crear nuevos tipos de eventos
especializando java.util.EventObject o los eventos AWT
java.awt.AWTEvent
• Los eventos del AWT se encuentran en el paquete
java.awt.event
Gestion de eventos
• 1. Una clase que desee gestionar un evento debe
implementar un interfaz (e.g. ActionListener)
❏ class ClaseGestor implements ActionListener { ….}
• 2. Establecer la relación entre la fuente de eventos
(componente) y el objetoClaseGestor que gestiona el
evento
❏ componente.addActionListener(objetoClaseGestor)
• 3. Implementación del método o métodos del interfaz en la
clase que gestiona el evento
❏ public void actionPerformed(ActionEvent ev) {
// codigo que implementa la respuesta a la acción del usuario
// sobre el componente
}
• Toda la información sobre el evento viene encapsulada en un
objeto de una clase específica derivada de Event
Java
11
Java
10
12
❏
Eventos: bajo nivel y semánticos
• Eventos de bajo nivel
• Representan entradas o interacciones de bajo nivel con
elementos del interfaz gráfico
-Cambio de tamaño, cambio del foco, operación con el ratón o con el teclado
• Eventos semánticos
• Eventos de alto nivel que encapsulan la semántica del modelo
de componentes del interfaz de usuario
-Hacer una acción, un cambio de estado en un elemento, ...
• No están relacionados con una clase específica de componente
sino que pueden aplicarse a todos los componentes que
implementen un modelo semántico similar
❏ Evento “action”
-Lanzado por un botón cuando se pulsa una vez
-Lanzado por un elemento de una lista cuando se pulsa dos veces seguidas
-Lanzado por una opción de un menú cuando se selecciona
-Cuando se pulsa Enter en un campo de texto
Java
Eventos de bajo nivel
Evento
Significado
ComponentEvent
Cambios en el tamaño, posición o visibilidad de un componente
FocusEvent
KeyEvent
MouseEvent
Cambio de foco (capacidad de un componente para recibir
entradas desde el teclado)
Operación con el teclado
Operación con los botones del ratón o movimientos del ratón
WindowEvent
Cambio de estado en una ventana
AncestorEvent
Cambio en la composición, visibilidad o posición de un
elemento superior (ancestro) de la jerarquía de composición
Eventos de alto nivel
ActionEvent
ChangeEvent
ItemEvent
CaretEvent
ListSelectionEvent
Realización de la acción específica asociada al componente
Cambio en el estado del componente
Elemento seleccionado o deseleccionado
Cambio en la posición del cursor de inserción en un
componente que gestiona texto
Cambio en la selección actual en una lista
13
Java
Eventos AWT : bajo nivel y semánticos
Ejemplo 1- tratamiento de eventos
bajo nivel
java.awt.AWTEvent
java.awt.event.ComponentEvent (component resized, moved, etc.)
java.awt.event.FocusEvent (component got focus, lost focus)
java.awt.event.InputEvent
java.awt.event.KeyEvent (component got key-press, etc.)
java.awt.event.MouseEvent (component got mouse-down, etc.)
java.awt.event.ContainerEvent
java.awt.event.WindowEvent
semánticos
java.awt.AWTEvent
java.awt.event.ActionEvent ("do a command")
java.awt.event.AdjustmentEvent ("value was adjusted")
java.awt.event.ItemEvent ("item state has changed")
java.awt.event.TextEvent ("the value of the text object changed")
import java.awt.event.*;
import javax.swing.*;
public class GUISimple extends JFrame {
public GUISimple (){
JPanel panel = new JPanel();
JLabel etiqueta = new JLabel("Etiqueta 1");
panel.add(etiqueta);
JButton boton= new JButton("Correcto");
panel.add(boton);
GestorRaton oyenteBoton = new GestorRaton();
boton.addActionListener(oyenteBoton);
// se añade el panel al panel de contenido
getContentPane().add(panel);
setSize(250,80);
setVisible(true);}
public static void main(String args[]) {
GUISimple ventana = new GUISimple();
ventana.setTitle("ventana tipo JFrame"); }} // GUISimple
class GestorRaton implements ActionListener {
public void actionPerformed(ActionEvent evento) {
JButton boton = (JButton) evento.getSource();
System.out.println("Se ha pulsado el boton: " + boton.getLabel()); }}
Java
15
Java
14
16
Ejemplo 9.1: Java:Iniciación y referencia
Ejemplo 9.1: Java:Iniciación y ref
Comentarios de: Programación basada en eventos (0)
No hay comentarios