Manejo de eventos en javafx

Posted by in Componentes JavaFX, Java, JavaFx

Los eventos en javafx se gestionan de forma similar al uso de los mismos en la programación de Android. Para ello se deben configurar EventHandler o punteros que ejecutan un método concreto ante una acción determinada. Antes de ver las posibilidades se debe entender cual es la propagación del evento, ya que gracias a esta propagación los eventos pueden ser capturados en diferentes partes de la interfaz. Para este ejemplo se cuenta con la interfaz expuesta en la cabecera, la cual cuenta con el siguiente esquema:

Como se puede observar en el gráfico los nodos son jerárquicos, dependiendo todos del Stage. Entendida esta jerarquía, la propagación de eventos se realiza desde el nodo superior hasta el nodo donde realmente se produce el evento. Por ejemplo; si se produce un evento de tipo KeyEvent en el editNombre, el evento pasará por todos los nodos que estén situados por encima en la jerarquía (Stage – Scene – BorderPane – GridPane – GridPane — editNombre). Gracias a esta jerarquía los eventos podrán ser capturados en cualquier punto del recorrido mediante un filtro o directamente en el nodo mediante un manejador.

Tipos de eventos

La base de la captura y funcionalidad de los eventos son los objetos de tipo EventHandler, ya que sea el tipo que sea siempre se utilizarán. En su definición se indica el tipo de evento que se maneja y se sobrescribe el método handle(TipoEvento), el cual trae un objeto del tipo del evento producido del que se podrá extraer toda la información deseada

Dependerá de donde se quiera capturar el objeto el sitio donde se captura el evento

EventFilter

Este tipo de captura evalúa el nodo donde se define el filtro y todos los nodos hijos para comprobar si en alguno de ellos se produce un tipo del evento indicado. En el ejemplo se puede observar como los elementos edit están englobados en sendos GridPane

Si en el nodo superior se define un filtro, este evaluará si el evento indicado se produce en el layout principal o en cualquiera de los edit que dependen de él

Para ello se ejecuta el método addEventFilter indicando el tipo de evento y un objeto de tipo EventHandler explicado antes. En este ejemplo los elementos situados en el layout de números tan solo admitirán números mientras que los de las letras tan solo admitirán letras

EventHandler

Muy similar al anterior, con la diferencia que ahora se evalúa un nodo únicamente por lo que si el evento se produce en alguno de sus hijos no se realizará acción alguna

Como se puede ver la construcción es idéntica excepto el nombre del método

Método directo

Similar al anterior, con la diferencia que no se utiliza un EventHandler indicando el tipo de evento que se quiere evaluar, sino que se utiliza un método setOnXXX indicando la acción que se quiere llevar a cabo y automáticamente se crea el tipo de evento

Método asociado

Se trata de la ejecución de un método indicado en las propiedades XML del nodo. En este caso no se obtiene información asociada del evento producido ya que no se tiene un objeto de tipo Event, tan solo se ejecutan las acciones indicadas en el método

Una vez definido el método el nombre del método que se va a asociar, en la clase controladora se define, siempre con la etiqueta @FXML antes para que se pueda asociar clase controladora con clase vista