5 Eventos¶
Introducción¶
Las aplicaciones gráficas son dirigidas por eventos, es decir, ejecutarán diferente código en función de los eventos que produzcan. Estos eventos pueden ser generados por los usuarios, una aplicación o un sistema.
Un evento es un cambio de estado en un dispositivo, una acción de un usuario, o una tarea en segundo plano. Los eventos pueden ser lanzados como resultado de hacer scroll o editar nodos complejos, como TableView
o TreeView
.
En las aplicaciones JavaFX existe un hilo que escucha los eventos que se producen. Cuando un evento es lanzado, el hilo de la interfaz gráfica comprueba si hay un manejador de eventos registrado para ese evento, y así ejecutarlo.
Event¶
La clase que representa los eventos en JavaFX es Event
del paquete javafx.event
. Esta clase tiene muchas subclases que representan los distintos eventos que pueden suceder en un aplicación, como MouseEvent
, KeyEvent
, WindowEvent
, etc.
Cada evento tiene las siguientes propiedades:
- Source: objeto donde se ha registrado el manejador del evento.
- Target: objeto donde se ha producido el evento. Por ejemplo, un botón.
- Type: tipo de evento producido. Por ejemplo, presionar un botón, una tecla, etc.
El objeto donde se generó el evento delega la tarea de manejo de eventos al controlador de eventos cuando ocurre el evento, el objeto de origen crea un objeto de evento y lo envía al controlador de eventos registrado.
Cuando se produce un evento se determina la ruta del evento mediante un Event Dispatch chain que no es más que un camino donde Stage
vincula el nodo de origen del evento. Una vez construido el evento, viaja desde el nodo raíz hasta el nodo fuente del evento (fase captura). Si algún nodo tiene un filtro registrado para el evento, se ejecutará. Durante la fase de burbuja (bubbling phase) el evento viaja en sentido inverso, desde el nodo a la raíz. Si algún nodo tiene un controlador registrado para el evento, se ejecutará
Algunos nodos, como el botón, consumen el evento, por lo que no se propaga a través de cadena de nodos.
EventHandler¶
JavaFX tiene una única interfaz para todos los manejadores de eventos, EventHandler<T extends Event>
, parametrizada con un tipo que sea hijo de la clase Event
:
classDiagram
class EventHandler~T extends Event~
<<interface>> EventHandler
EventHandler: handler(event T)
Para responder a un evento, es necesario implementar la interfaz EventHandler
. Para ello, habrá que indicar el tipo de evento a manejar.
Para agregar estos manejadores de eventos puede usarse el método addEventHandler(EventType<T> type, EventHandler<? extends T>)
, donde se indica el tipo de evento, y el manejador de eventos.
Tipos de eventos¶
En JavaFX existen diferentes tipos de eventos:
ActionEvent
: Ocurren cuando un usuario realiza una acción específica. Los eventos comunes esACTION
.MouseEvent
: Incluyen acciones del ratón, como hacer clic, mover el ratón, presionar o soltar botones del ratón. Sus eventos son:MOUSE_CLICKED
para cuando se hace click en el ratón,MOUSE_ENTERED
para cuando el ratón entra en un Nodo, yMOUSE_EXITED
, para cuando sale.KeyEvent
: Se activan cuando el usuario interactúa con el teclado, como presionar o soltar una tecla. Sus acciones son:KEY_PRESSED
para cuando se presiona una tecla,KEY_RELEASED
para cunado se deja de presionar una tecla,KEY_TYPED
para cuando una tecla ya ha sido escrita (se produce después deKEY_PRESSED
).ChangeEvent
: Ocurren cuando hay cambios en el estado de un control.FocusEvent
: Se disparan cuando un nodo obtiene o pierde el foco.DragEvent
: Se utilizan cuando el usuario arrastra elementos dentro de la aplicación y los suelta. Sus acciones son:DRAG_DETECTED
que representa un evento cuando se inicia un gesto de arrastre yDRAG_DROPPED
que representa un evento cuando se suelta un objeto durante un gesto de arrastre.ScrollEvent
: Ocurren cuando se realiza un desplazamiento (scroll) con el ratón o la rueda del ratón.SCROLL
es la acción que representa un evento de desplazamiento, que ocurre cuando el usuario usa la rueda del ratón o realiza un desplazamiento táctil.WindowEvent
: Se activan cuando ocurren cambios en el estado de la ventana de la aplicación, como abrir, cerrar, maximizar, minimizar, etc. Sus eventos son:WINDOW_SHOWN
que representa un evento cuando la ventana se muestra yWINDOW_HIDDEN
cuando se oculta.
Algunas clases en JavaFX definen propiedades para el manejo de eventos, que proporcionan una forma de registrar manejadores de eventos. Los setters de estas propiedades permitirán registrar manejadores de eventos, su sintaxis es : setOnEventXXX(EventHandler<T extends Event>)
donde XXX
es el tipo de evento. Por ejemplo para MouseEvent
tenemos setOnEventMouseClicked