JavaFX - Gestion des événements

Dans JavaFX, nous pouvons développer des applications GUI, des applications Web et des applications graphiques. Dans de telles applications, chaque fois qu'un utilisateur interagit avec l'application (nœuds), on dit qu'un événement s'est produit.

Par exemple, cliquer sur un bouton, déplacer la souris, saisir un caractère à l'aide du clavier, sélectionner un élément dans la liste, faire défiler la page sont les activités qui provoquent la survenue d'un événement.

Types d'événements

Les événements peuvent être classés dans les deux catégories suivantes -

  • Foreground Events- Les événements qui nécessitent l'interaction directe d'un utilisateur. Ils sont générés comme les conséquences d'une personne interagissant avec les composants graphiques dans une interface utilisateur graphique. Par exemple, cliquer sur un bouton, déplacer la souris, saisir un caractère via le clavier, sélectionner un élément dans la liste, faire défiler la page, etc.

  • Background Events- Les événements qui nécessitent l'interaction de l'utilisateur final sont appelés événements d'arrière-plan. Les interruptions du système d'exploitation, les pannes matérielles ou logicielles, l'expiration du temporisateur, la fin de l'opération sont des exemples d'événements en arrière-plan.

Événements dans JavaFX

JavaFX permet de gérer une grande variété d'événements. La classe nomméeEvent du forfait javafx.event est la classe de base d'un événement.

Une instance de l'une de ses sous-classes est un événement. JavaFX fournit une grande variété d'événements. Certains d'entre eux sont énumérés ci-dessous.

  • Mouse Event- Il s'agit d'un événement d'entrée qui se produit lorsqu'un clic de souris est effectué. Il est représenté par la classe nomméeMouseEvent. Il comprend des actions telles qu'un clic de souris, une pression sur la souris, une souris relâchée, une souris déplacée, une cible entrée par la souris, une cible sortie par la souris, etc.

  • Key Event- Il s'agit d'un événement d'entrée qui indique que le coup de touche s'est produit sur un nœud. Il est représenté par la classe nomméeKeyEvent. Cet événement comprend des actions telles que la touche enfoncée, la touche relâchée et la touche tapée.

  • Drag Event- Il s'agit d'un événement d'entrée qui se produit lorsque la souris est déplacée. Il est représenté par la classe nomméeDragEvent. Il comprend des actions telles que glisser entré, glisser déposé, faire glisser la cible entrée, faire glisser la cible sortie, glisser sur, etc.

  • Window Event- Il s'agit d'un événement lié à la fenêtre affichant / masquant des actions. Il est représenté par la classe nomméeWindowEvent. Il comprend des actions comme le masquage de la fenêtre, la fenêtre affichée, la fenêtre masquée, la fenêtre affichée, etc.

Gestion des événements

La gestion des événements est le mécanisme qui contrôle l'événement et décide de ce qui doit se passer si un événement se produit. Ce mécanisme a le code qui est connu comme un gestionnaire d'événements qui est exécuté lorsqu'un événement se produit.

JavaFX fournit des gestionnaires et des filtres pour gérer les événements. Dans JavaFX, chaque événement a -

  • Target- Le nœud sur lequel un événement s'est produit. Une cible peut être une fenêtre, une scène et un nœud.

  • Source- La source à partir de laquelle l'événement est généré sera la source de l'événement. Dans le scénario ci-dessus, la souris est la source de l'événement.

  • Type- Type d'événement survenu; en cas d'événement souris - souris enfoncée, souris relâchée sont le type d'événements.

Supposons que nous ayons une application qui a des boutons Circle, Stop et Play insérés à l'aide d'un objet de groupe comme suit -

Si vous cliquez sur le bouton de lecture, la source sera la souris, le nœud cible sera le bouton de lecture et le type d'événement généré sera le clic de souris.

Phases de la gestion des événements dans JavaFX

Chaque fois qu'un événement est généré, JavaFX subit les phases suivantes.

Construction d'itinéraire

Chaque fois qu'un événement est généré, l'itinéraire par défaut / initial de l'événement est déterminé par la construction d'un Event Dispatch chain. C'est le chemin de la scène au nœud source.

Voici la chaîne de distribution d'événements pour l'événement généré, lorsque nous cliquons sur le bouton de lecture dans le scénario ci-dessus.

Phase de capture d'événement

Après la construction de la chaîne de distribution d'événements, le nœud racine de l'application distribue l'événement. Cet événement se déplace vers tous les nœuds de la chaîne de répartition (de haut en bas). Si l'un de ces nœuds a unfilterenregistré pour l'événement généré, il sera exécuté. Si aucun des nœuds de la chaîne de distribution n'a de filtre pour l'événement généré, il est alors transmis au nœud cible et finalement le nœud cible traite l'événement.

Phase de bulles d'événement

Dans la phase d'événement bouillonnant, l'événement est parcouru du nœud cible au nœud d'étape (de bas en haut). Si l'un des nœuds de la chaîne de répartition d'événements a unhandlerenregistré pour l'événement généré, il sera exécuté. Si aucun de ces nœuds n'a de gestionnaire pour gérer l'événement, l'événement atteint le nœud racine et finalement le processus sera terminé.

Gestionnaires d'événements et filtres

Les filtres et les gestionnaires d'événements sont ceux qui contiennent la logique d'application pour traiter un événement. Un nœud peut s'inscrire auprès de plusieurs gestionnaires / filtres. Dans le cas de nœuds parents-enfants, vous pouvez fournir un filtre / gestionnaire commun aux parents, qui est traité par défaut pour tous les nœuds enfants.

Comme mentionné ci-dessus, pendant l'événement, le traitement est un filtre qui est exécuté et pendant la phase de bullage d'événements, un gestionnaire est exécuté. Tous les gestionnaires et filtres implémentent l'interfaceEventHandler du forfait javafx.event.

Ajout et suppression d'un filtre d'événement

Pour ajouter un filtre d'événements à un nœud, vous devez enregistrer ce filtre à l'aide de la méthode addEventFilter() du Node classe.

//Creating the mouse event handler 
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() { 
   @Override 
   public void handle(MouseEvent e) { 
      System.out.println("Hello World"); 
      circle.setFill(Color.DARKSLATEBLUE);  
   } 
};   
//Adding event Filter 
Circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);

De la même manière, vous pouvez supprimer un filtre en utilisant la méthode removeEventFilter () comme indiqué ci-dessous -

circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);

Exemple de gestion d'événements

Voici un exemple illustrant la gestion des événements dans JavaFX à l'aide des filtres d'événements. Enregistrez ce code dans un fichier avec un nomEventFiltersExample.java.

import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javafx.event.EventHandler;
 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 

import javafx.scene.text.Font; 
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text; 
import javafx.stage.Stage; 
         
public class EventFiltersExample extends Application { 
   @Override 
   public void start(Stage stage) {      
      //Drawing a Circle 
      Circle circle = new Circle(); 
      
      //Setting the position of the circle 
      circle.setCenterX(300.0f); 
      circle.setCenterY(135.0f); 
      
      //Setting the radius of the circle 
      circle.setRadius(25.0f); 
      
      //Setting the color of the circle 
      circle.setFill(Color.BROWN); 
      
      //Setting the stroke width of the circle 
      circle.setStrokeWidth(20);      
       
      //Setting the text 
      Text text = new Text("Click on the circle to change its color"); 
      
      //Setting the font of the text 
      text.setFont(Font.font(null, FontWeight.BOLD, 15));     
      
      //Setting the color of the text 
      text.setFill(Color.CRIMSON); 
  
      //setting the position of the text 
      text.setX(150); 
      text.setY(50); 
       
      //Creating the mouse event handler 
      EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() { 
         @Override 
         public void handle(MouseEvent e) { 
            System.out.println("Hello World"); 
            circle.setFill(Color.DARKSLATEBLUE);
         } 
      };  
      //Registering the event filter 
      circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);   
       
      //Creating a Group object  
      Group root = new Group(circle, text); 
         
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 300); 
       
      //Setting the fill color to the scene 
      scene.setFill(Color.LAVENDER);  
      
      //Setting title to the Stage 
      stage.setTitle("Event Filters Example");       
         
      //Adding scene to the stage 
      stage.setScene(scene); 
         
      //Displaying the contents of the stage 
      stage.show(); 
   } 
   public static void main(String args[]){ 
      launch(args); 
   } 
}

Compilez et exécutez le fichier java enregistré à partir de l'invite de commande à l'aide des commandes suivantes.

javac EventFiltersExample.java 
java EventFiltersExample

Lors de l'exécution, le programme ci-dessus génère une fenêtre JavaFX comme indiqué ci-dessous.

Ajout et suppression de gestionnaires d'événements

Pour ajouter un gestionnaire d'événements à un nœud, vous devez enregistrer ce gestionnaire à l'aide de la méthode addEventHandler() du Node classe comme indiqué ci-dessous.

//Creating the mouse event handler 
EventHandler<javafx.scene.input.MouseEvent> eventHandler = 
   new EventHandler<javafx.scene.input.MouseEvent>() { 
   
   @Override 
   public void handle(javafx.scene.input.MouseEvent e) { 
      System.out.println("Hello World"); 
      circle.setFill(Color.DARKSLATEBLUE);             
   } 
};    
//Adding the event handler 
circle.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandler);

De la même manière, vous pouvez supprimer un gestionnaire d'événements à l'aide de la méthode removeEventHandler () comme indiqué ci-dessous -

circle.removeEventHandler(MouseEvent.MOUSE_CLICKED, eventHandler);

Exemple

Le programme suivant est un exemple illustrant la gestion des événements dans JavaFX à l'aide des gestionnaires d'événements.

Enregistrez ce code dans un fichier avec un nom EventHandlersExample.java.

import javafx.animation.RotateTransition; 
import javafx.application.Application; 
import javafx.event.EventHandler; 

import javafx.scene.Group; 
import javafx.scene.PerspectiveCamera; 
import javafx.scene.Scene; 
import javafx.scene.control.TextField; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.paint.Color; 
import javafx.scene.paint.PhongMaterial;
 
import javafx.scene.shape.Box; 
import javafx.scene.text.Font; 
import javafx.scene.text.FontWeight; 
import javafx.scene.text.Text;  
import javafx.scene.transform.Rotate; 
import javafx.stage.Stage; 
import javafx.util.Duration; 
         
public class EventHandlersExample extends Application { 
   
   @Override 
   public void start(Stage stage) {
      //Drawing a Box 
      Box box = new Box(); 
      
      //Setting the properties of the Box 
      box.setWidth(150.0); 
      box.setHeight(150.0);   
      box.setDepth(100.0); 
       
      //Setting the position of the box 
      box.setTranslateX(350);  
      box.setTranslateY(150); 
      box.setTranslateZ(50); 
       
      //Setting the text 
      Text text = new Text("Type any letter to rotate the box, 
         and click on the box to stop the rotation"); 
      
      //Setting the font of the text 
      text.setFont(Font.font(null, FontWeight.BOLD, 15));     
      
      //Setting the color of the text 
      text.setFill(Color.CRIMSON); 
      
      //setting the position of the text 
      text.setX(20); 
      text.setY(50); 
       
      //Setting the material of the box 
      PhongMaterial material = new PhongMaterial();  
      material.setDiffuseColor(Color.DARKSLATEBLUE);  
      
      //Setting the diffuse color material to box 
      box.setMaterial(material);       
       
      //Setting the rotation animation to the box    
      RotateTransition rotateTransition = new RotateTransition(); 
      
      //Setting the duration for the transition 
      rotateTransition.setDuration(Duration.millis(1000)); 
      
      //Setting the node for the transition 
      rotateTransition.setNode(box);       
      
      //Setting the axis of the rotation 
      rotateTransition.setAxis(Rotate.Y_AXIS); 
      
      //Setting the angle of the rotation
      rotateTransition.setByAngle(360); 
      
      //Setting the cycle count for the transition 
      rotateTransition.setCycleCount(50); 
      
      //Setting auto reverse value to false 
      rotateTransition.setAutoReverse(false);  
      
      //Creating a text filed 
      TextField textField = new TextField();   
      
      //Setting the position of the text field 
      textField.setLayoutX(50); 
      textField.setLayoutY(100); 
       
      //Handling the key typed event 
      EventHandler<KeyEvent> eventHandlerTextField = new EventHandler<KeyEvent>() { 
         @Override 
         public void handle(KeyEvent event) { 
            //Playing the animation 
            rotateTransition.play(); 
         }           
      };              
      //Adding an event handler to the text feld 
      textField.addEventHandler(KeyEvent.KEY_TYPED, eventHandlerTextField); 
       
      //Handling the mouse clicked event(on box) 
      EventHandler<javafx.scene.input.MouseEvent> eventHandlerBox = 
         new EventHandler<javafx.scene.input.MouseEvent>() { 
         
         @Override 
         public void handle(javafx.scene.input.MouseEvent e) { 
            rotateTransition.stop();  
         } 
      }; 
      //Adding the event handler to the box  
      box.addEventHandler(javafx.scene.input.MouseEvent.MOUSE_CLICKED, eventHandlerBox);
       
      //Creating a Group object
      Group root = new Group(box, textField, text); 
         
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 300);      
      
      //Setting camera 
      PerspectiveCamera camera = new PerspectiveCamera(false); 
      camera.setTranslateX(0); 
      camera.setTranslateY(0); 
      camera.setTranslateZ(0); 
      scene.setCamera(camera);  
      
      //Setting title to the Stage 
      stage.setTitle("Event Handlers Example"); 
         
      //Adding scene to the stage 
      stage.setScene(scene); 
         
      //Displaying the contents of the stage 
      stage.show(); 
   } 
   public static void main(String args[]){ 
      launch(args); 
   } 
}

Compilez et exécutez le fichier java enregistré à partir de l'invite de commande à l'aide des commandes suivantes.

javac EventHandlersExample.java 
java EventHandlersExample

Lors de l'exécution, le programme ci-dessus génère une fenêtre JavaFX affichant un champ de texte et une boîte 3D comme indiqué ci-dessous -

Ici, si vous tapez une lettre dans le champ de texte, la boîte 3D commence à tourner le long de l'axe x. Si vous cliquez à nouveau sur la case, la rotation s'arrête.

Utilisation de méthodes pratiques pour la gestion des événements

Certaines classes de JavaFX définissent les propriétés du gestionnaire d'événements. En définissant les valeurs sur ces propriétés à l'aide de leurs méthodes de définition respectives, vous pouvez vous inscrire à un gestionnaire d'événements. Ces méthodes sont appelées méthodes de commodité.

La plupart de ces méthodes existent dans les classes comme Node, Scene, Window, etc., et elles sont disponibles pour toutes leurs sous-classes.

Par exemple, pour ajouter un écouteur d'événement de souris à un bouton, vous pouvez utiliser la méthode pratique setOnMouseClicked() comme indiqué ci-dessous.

playButton.setOnMouseClicked((new EventHandler<MouseEvent>() { 
   public void handle(MouseEvent event) { 
      System.out.println("Hello World"); 
      pathTransition.play(); 
   } 
}));

Exemple

Le programme suivant est un exemple qui illustre la gestion des événements dans JavaFX à l'aide des méthodes pratiques.

Enregistrez ce code dans un fichier avec le nom ConvinienceMethodsExample.java.

import javafx.animation.PathTransition; 
import javafx.application.Application; 
import static javafx.application.Application.launch; 
import javafx.event.EventHandler; 

import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.paint.Color; 

import javafx.scene.shape.Circle; 
import javafx.scene.shape.LineTo; 
import javafx.scene.shape.MoveTo; 
import javafx.scene.shape.Path; 
import javafx.stage.Stage; 
import javafx.util.Duration; 
         
public class ConvinienceMethodsExample extends Application { 
   @Override 
   public void start(Stage stage) {      
      //Drawing a Circle 
      Circle circle = new Circle(); 
      
      //Setting the position of the circle 
      circle.setCenterX(300.0f); 
      circle.setCenterY(135.0f); 
      
      //Setting the radius of the circle 
      circle.setRadius(25.0f);  
      
      //Setting the color of the circle 
      circle.setFill(Color.BROWN); 
      
      //Setting the stroke width of the circle 
      circle.setStrokeWidth(20);      
       
      //Creating a Path 
      Path path = new Path(); 
      
      //Moving to the staring point 
      MoveTo moveTo = new MoveTo(208, 71);               
      
      //Creating 1st line 
      LineTo line1 = new LineTo(421, 161);        
      
      //Creating 2nd line 
      LineTo line2 = new LineTo(226,232); 
      
      //Creating 3rd line 
      LineTo line3 = new LineTo(332,52);        
      
      //Creating 4th line 
      LineTo line4 = new LineTo(369, 250);        
      
      //Creating 5th line 
      LineTo line5 = new LineTo(208, 71);       
      
      //Adding all the elements to the path 
      path.getElements().add(moveTo); 
      path.getElements().addAll(line1, line2, line3, line4, line5);     
      
      //Creating the path transition 
      PathTransition pathTransition = new PathTransition(); 
      
      //Setting the duration of the transition 
      pathTransition.setDuration(Duration.millis(1000));       
      
      //Setting the node for the transition 
      pathTransition.setNode(circle); 
      
      //Setting the path for the transition 
      pathTransition.setPath(path); 
      
      //Setting the orientation of the path 
      pathTransition.setOrientation(
         PathTransition.OrientationType.ORTHOGONAL_TO_TAN GENT);
      
      //Setting the cycle count for the transition 
      pathTransition.setCycleCount(50); 
      
      //Setting auto reverse value to true 
      pathTransition.setAutoReverse(false);
      
      //Creating play button 
      Button playButton = new Button("Play"); 
      playButton.setLayoutX(300); 
      playButton.setLayoutY(250); 
       
      circle.setOnMouseClicked (new EventHandler<javafx.scene.input.MouseEvent>() { 
         @Override 
         public void handle(javafx.scene.input.MouseEvent e) { 
            System.out.println("Hello World"); 
            circle.setFill(Color.DARKSLATEBLUE);             
         } 
      });   
      playButton.setOnMouseClicked((new EventHandler<MouseEvent>() { 
         public void handle(MouseEvent event) { 
            System.out.println("Hello World");  
            pathTransition.play(); 
         } 
      })); 
       
      //Creating stop button 
      Button stopButton = new Button("stop"); 
      stopButton.setLayoutX(250); 
      stopButton.setLayoutY(250); 
      
      stopButton.setOnMouseClicked((new EventHandler<MouseEvent>() { 
         public void handle(MouseEvent event) { 
            System.out.println("Hello World"); 
            pathTransition.stop(); 
         } 
      }));
      //Creating a Group object  
      Group root = new Group(circle, playButton, stopButton); 
         
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 300); 
      scene.setFill(Color.LAVENDER);  
      
      //Setting title to the Stage 
      stage.setTitle("Convenience Methods Example");  
         
      //Adding scene to the stage 
      stage.setScene(scene); 
         
      //Displaying the contents of the stage 
      stage.show(); 
   } 
   public static void main(String args[]){ 
      launch(args); 
   } 
}

Compilez et exécutez le fichier java enregistré à partir de l'invite de commande à l'aide des commandes suivantes.

javac ConvinienceMethodsExample.java 
java ConvinienceMethodsExample

Lors de l'exécution, le programme ci-dessus génère une fenêtre JavaFX comme indiqué ci-dessous. Cliquez ici sur le bouton de lecture pour démarrer l'animation et cliquez sur le bouton d'arrêt pour arrêter l'animation.