13.20 événements et gestionnaires
Dans cette vidéo, nous abordons les événements et gestionnaires d'événements en JavaFX. Jusqu'ici, en interagissant avec les contrôles, nous avons vu que rien ne se passait — l'application ne réagissait pas. C'est normal : nous n'avons pas encore relié les actions de l'utilisateur à du code à exécuter. C'est précisément le rôle des event handlers.
Brancher un événement sur un bouton
Un event handler est une méthode appelée automatiquement par l'application en réponse à une interaction. Si on appuie sur Run dans IntelliJ, c'est IntelliJ qui exécute du code en réponse à ce clic — le même mécanisme que celui que nous allons mettre en place dans notre propre application.
Je crée un nouveau projet JavaFX et j'ajoute un Button à mon GridPane, avec un texte « Message », un rowIndex = 0 et un columnIndex = 0. Au lancement, le bouton est visible mais le clic ne déclenche rien : il n'y a pas de gestionnaire associé. Contrairement à une application console qui s'exécute linéairement, une application graphique attend un événement pour réagir.
Dans le fichier HelloController, je crée une méthode qui sera appelée au clic, puis dans le .fxml j'ajoute la propriété onAction="#nomMethode" sur le bouton. Au rechargement, cliquer affiche bien « Bonjour » dans la console. Premier event handler fonctionnel.
Récupérer la saisie d'un TextField
Ajoutons un TextField au GridPane pour personnaliser le message. Dans le fichier FXML, on lui attribue un fx:id :
<TextField fx:id="nameField" />
Côté contrôleur, on déclare une variable du même nom, annotée @FXML :
@FXML
private TextField nameField;
Il ne reste plus qu'à concaténer le texte saisi dans le handler : System.out.println("Bonjour " + nameField.getText());. En tapant « Tom » dans le champ puis en cliquant, la console affiche « Bonjour Tom ». Le contrôle est entièrement piloté par notre code. À bientôt dans la prochaine vidéo.
En résumé
Cette leçon explique le rôle fondamental des événements et des gestionnaires d'événements dans les applications avec interface graphique. Contrairement aux applications console qui s'exécutent de manière procédurale, une GUI doit réagir aux interactions de l'utilisateur (clics, saisies). Le tutoriel pratique en JavaFX montre comment créer un gestionnaire d'événements pour un bouton, puis accéder aux données saisies dans un champ de texte via l'annotation @fxml.
Points clés
- Un gestionnaire d'événements est une méthode exécutée automatiquement lorsque l'utilisateur interagit avec un contrôle (clic de bouton, frappe de texte, etc.)
- La propriété 'onAction' du bouton permet de lier celui-ci à son gestionnaire d'événements dans le contrôleur
- Pour accéder à un contrôle (TextField, Button) depuis le code, il faut lui attribuer un fx:id et créer une variable d'instance annotée @fxml portant exactement le même nom
- La méthode getText() sur un TextField permet de récupérer le texte saisi par l'utilisateur pour le traiter dans le gestionnaire
- Les applications GUI sont orientées événements : contrairement aux applications console procédurales, elles attendent les actions de l'utilisateur et réagissent en conséquence
Questions fréquentes
Qu'est-ce qu'un gestionnaire d'événements et pourquoi est-ce indispensable dans une GUI ?
Un gestionnaire d'événements est une méthode exécutée automatiquement lorsqu'un utilisateur interagit avec un contrôle (bouton, champ de texte, etc.). Sans gestionnaire d'événements, l'application n'est pas consciente des interactions de l'utilisateur et ne peut pas y réagir. C'est le mécanisme fondamental qui transforme une interface statique en application interactive.
Comment lier un bouton à un gestionnaire d'événements en JavaFX ?
On utilise la propriété 'onAction' du bouton en FXML et on la pointe vers une méthode du contrôleur (par exemple onAction="#handleButtonClick"). Dans le contrôleur, on crée la méthode correspondante qui contient le code à exécuter quand le bouton est cliqué.
Comment accéder aux données saisies dans un TextField depuis un gestionnaire d'événements ?
Il faut d'abord attribuer un fx:id au TextField en FXML (par exemple fx:id="nameField"), créer une variable d'instance dans le contrôleur avec l'annotation @fxml et exactement le même nom (private TextField nameField;), puis appeler la méthode getText() sur cette variable pour récupérer le texte saisi.