FAQ JavaFXConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 507, dernière mise à jour : 2 novembre 2016 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur le forum JavaFX de http://java.developpez.com ainsi que l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
- Comment détecter des événements clavier sur un nœud ?
- Comment détecter des événements souris sur un nœud ?
- Comment bloquer ou débloquer les événements de la souris ?
- Comment détecter le défilement avec la roulette de la souris ?
- Comment détecter le défilement tactile ?
- Comment détecter le zoom tactile ?
- Comment détecter la rotation tactile ?
- Comment détecter le balayage tactile ?
- Comment détecter la sélection tactile ?
Vous devez modifier la valeur de l'un des callbacks suivants de la classe javax.scene.Node en spécifiant un objet de type EventHandler<KeyEvent> :
- onKeyPressed - ce callback est appelé quand une touche est enfoncée. Il permet de manipuler le code de la touche ;
- onKeyReleased - ce callback est appelé quand une touche est relâchée. Il permet de manipuler le code de la touche ;
- onKeyTyped - ce callback est appelé quand une touche a été saisie. Il permet de connaitre le caractère qui a été saisi.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class Main extends Application { @Override public void start(Stage primaryStage) { final Rectangle rectangle = new Rectangle(100, 100, 150, 100); rectangle.setFill(Color.RED); rectangle.setFocusTraversable(true); rectangle.setOnKeyPressed(keyEvent -> System.out.printf("Touche enfoncée : %s %s", keyEvent.getCode(), keyEvent.getCharacter()).println()); rectangle.setOnKeyTyped(keyEvent -> System.out.printf("Touche saisie : %s %s", keyEvent.getCode(), keyEvent.getCharacter()).println()); rectangle.setOnKeyReleased(keyEvent -> System.out.printf("Touche relâchée : %s %s", keyEvent.getCode(), keyEvent.getCharacter()).println()); final Pane root = new Pane(); root.getChildren().setAll(rectangle); final Scene scene = new Scene(root, 600, 600); primaryStage.setTitle("Test sur les événements clavier"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Tout d'abord, il faut savoir que pour pouvoir recevoir des événements clavier, notre nœud doit pouvoir obtenir le focus. Nous devons donc commencer par mettre sa propriété focusTransversable à la valeur true. C'est également le cas pour toute autre forme géométrique ou tout nœud basique. Les contrôles sont quant à eux déjà prévus pour être utilisables au clavier et donc peuvent recevoir directement ces événements.
Lançons notre programme et appuyons sur la touche S du clavier. La console va afficher la sortie suivante :
Code texte : | Sélectionner tout |
1 2 3 | Touche enfoncée : S Touche saisie : UNDEFINED s Touche relâchée : S |
- la première ligne a été produite par le callback onKeyPressed : l’événement contient un code, mais pas de caractère ;
- La seconde ligne a été produite par le callback onKeyTyped : l’événement contient un caractère, mais son code n'est pas défini ;
- La dernière ligne a été produite par le callback onKeyReleased : l’événement contient un code, mais pas de caractère.
Vous devez modifier la valeur de l'un des callbacks suivants de la classe javax.scene.Node en spécifiant un objet de type EventHandler<MouseEvent> :
- onMouseClicked - ce callback est appelé si un clic de souris a eu lieu alors qu'elle se trouvait sur la surface du nœud ;
- onMouseDragged - ce callback est appelé si la souris est cliquée-tirée sur la surface du nœud (et au-delà s'il se poursuit). Il peut servir également à initialiser les événements de drag'n drop ;
- onMouseEntered - ce callback est appelé si la souris est entrée sur la surface du nœud ;
- onMouseExited - ce callback est appelé si la souris est sortie de la surface du nœud ;
- onMouseMoved - ce callback est appelé si la souris est déplacée sur la surface du nœud ;
- onMousePressed - ce callback est appelé si un bouton de la souris est enfoncé alors qu'elle se trouvait sur la surface du nœud ;
- onMouseReleased - ce callback est appelé si un bouton de la souris est relâché alors qu'elle se trouvait sur la surface du nœud.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class NodeMouseEvent extends Application { @Override public void start(Stage primaryStage) { final Rectangle rectangle = new Rectangle(100, 100, 150, 100); rectangle.setFill(Color.RED); rectangle.setOnMouseClicked(mouseEvent -> System.out.printf("Bouton %s cliqué sur le nœud, %d click(s) %f x %f.", mouseEvent.getButton(), mouseEvent.getClickCount(), mouseEvent.getX(), mouseEvent.getY()).println()); rectangle.setOnMouseDragged(mouseEvent -> System.out.printf("La souris effectue un cliquer-tirer sur le nœud %f x %f.", mouseEvent.getX(), mouseEvent.getY()).println()); rectangle.setOnMouseEntered(mouseEvent -> System.out.printf("La souris entre sur le nœud %f x %f.", mouseEvent.getX(), mouseEvent.getY()).println()); rectangle.setOnMouseExited(mouseEvent -> System.out.printf("La souris sort du nœud %f x %f.", mouseEvent.getX(), mouseEvent.getY()).println()); rectangle.setOnMouseMoved(mouseEvent -> System.out.printf("La souris se déplace sur le nœud %f x %f.", mouseEvent.getX(), mouseEvent.getY()).println()); rectangle.setOnMousePressed(mouseEvent -> System.out.printf("Bouton %s pressé sur le nœud %f x %f.", mouseEvent.getButton(), mouseEvent.getX(), mouseEvent.getY()).println()); rectangle.setOnMouseReleased(mouseEvent -> System.out.printf("Bouton %s relâché sur le nœud %f x %f.", mouseEvent.getButton(), mouseEvent.getX(), mouseEvent.getY()).println()); final Pane root = new Pane(); root.getChildren().setAll(rectangle); final Scene scene = new Scene(root, 600, 600); primaryStage.setTitle("Test sur les événements souris"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Contrairement à la gestion des événements clavier, nous n'avons pas besoin ici de modifier la propriété focusTransversable ; ce code fonctionne immédiatement.
Il existe également une gestion des événements de drag'n drop (DnD) qui permettent de faire transiter des valeurs, informations, nœuds ou contrôles vers et depuis le presse-papier, y compris vers le système natif. Cette gestion s'initialise en général via le callback onMouseDragged et utilise des callbacks supplémentaires à base de MouseDragEvent à positionner sur la source et la cible du DnD.
La gestion du défilement avec la roulette de la souris est désormais prise en charge par les événements de défilement tactiles.
Par défaut, les événements de souris tels que les clics ou les déplacements du curseur ne peuvent pas traverser des nœuds qui se trouvent être superposés les uns aux les autres. Le noeud situé au sommet de la pile d'affichage intercepte tous les événements. Seules les zones qui ne sont pas considérées comme faisant partie d'un nœud laissent passer les événements vers les nœuds situés en dessous.
Il est possible de modifier ce comportement en changeant la valeur de la propriété mouseTransparent :
- true - le nœud (ainsi que tous les sous-nœuds qu'il contient) ne réagit plus aux événements souris. Tous les événements sont propagés aux nœuds qui se trouvent affichés sous lui sans être bloqués.
- false - le nœud réagit à tous les événements souris. S'il s'agit d'un groupe, d'un gestionnaire de mise en page, d'un contrôle ou d'une skin, les événements souris seront transmis à ses nœuds enfants. Les autres nœuds qui se trouvent affichés sous lui seront occultés et ne recevront pas les événements déclenchés à l’intérieur du nœud.
La propriété mouseTransparent a pour valeur par défaut la valeur false.
Depuis JavaFX 2.x, les événements de défilement avec la roulette de la souris ont été unifiés avec la gestion des événements de défilement tactile. Vous devez donc utiliser les événements tactiles même si vous ne disposez pas d'interface de saisie tactile.
Vous devez modifier la valeur de l'un des callbacks suivants de la classe javax.scene.Node en spécifiant un objet de type EventHandler<ScrollEvent> :
- onScrollStarted - le défilement a commencé ;
- onScroll - le défilement est en cours ;
- onScrollFinished - le défilement est terminé.
L'objet de type ScrollEvent reçu en paramètre du callback dispose de méthodes permettant de connaitre l'axe, la direction et l’intensité du défilement de même que le nombre de lignes de texte équivalent au défilement en pixels.
Vous devez modifier la valeur de l'un des callbacks suivants de la classe javax.scene.Node en spécifiant un objet de type EventHandler<ZoomEvent> :
- onZoomStarted - le zoom a commencé ;
- onZoom - le zoom est en cours ;
- onZoomFinished - le zoom est terminé.
L'objet de type ZoomEvent reçu en paramètre du callback dispose de méthodes permettant de connaitre la position (en 3 dimensions) ainsi que le facteur de zoom.
Vous devez modifier la valeur de l'un des callbacks suivants de la classe javax.scene.Node en spécifiant un objet de type EventHandler<RotateEvent> :
- onRotationStarted - la rotation a commencé ;
- onRotate - la rotation est en cours ;
- onRotationFinished - la rotation est terminée.
L'objet de type RotateEvent reçu en paramètre du callback dispose de méthodes permettant de connaitre la position (en 3 dimensions) ainsi que l'angle de rotation.
Vous devez modifier la valeur de l'un des callbacks suivants de la classe javax.scene.Node en spécifiant un objet de type EventHandler<SwipeEvent> :
- onSwipeDown - un balayage vers le bas a eu lieu ;
- onSwipeLeft - un balayage vers la gauche a eu lieu ;
- onSwipeRight - un balayage vers la droite a eu lieu ;
- onSwipeUp - un balayage vers le haut a eu lieu.
L'objet de type SwipeEvent reçu en paramètre du callback dispose de méthodes permettant de connaitre la position (en 3 dimensions).
Vous devez modifier la valeur de l'un des callbacks suivants de la classe javax.scene.Node en spécifiant un objet de type EventHandler<TouchEvent> :
- onTouchMoved - la sélection tactile est déplacée ;
- onTouchPressed - la sélection tactile a commencé ;
- onTouchReleased - la sélection tactile a pris fin ;
- onTouchStationary - la sélection tactile reste stationnaire.
L'objet de type TouchEvent reçu en paramètre du callback dispose de méthodes permettant de connaitre la position (en 3 dimensions) ainsi que la liste des points tactiles activés.
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.