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 créer un champ d’édition textuel ?
- Comment créer un champ d’édition de mot de passe ?
- Comment créer une zone d’édition textuelle ?
- Comment savoir quand le contenu de mon champ d'édition a été modifié ?
- Comment modifier le texte dans un champ d'édition ?
- Comment savoir quand la sélection dans mon champ d'édition a été modifiée ?
- Comment modifier la sélection dans un champ d'édition ?
- Comment copier la sélection d'un champ d'édition ?
- Comment couper la sélection d'un champ d'édition ?
- Comment coller le contenu du presse-papier dans un champ d'édition ?
- Comment savoir quand la position du curseur de saisie dans mon champ d'édition a été modifiée ?
- Comment déplacer le curseur de saisie dans un champ d’édition ?
- Comment désactiver la saisie sur un contrôle de saisie ?
- Comment afficher une invite sur un contrôle de saisie ?
- Comment valider un mot de passe ?
- Comment forcer le retour à la ligne dans TextArea ?
- Comment activer le clavier virtuel sur ordinateur de bureau ?
- Comment spécifier le type de clavier virtuel ?
- Comment restreindre l'édition sur un contrôle de saisie ?
- Comment placer un filtre sur un formateur ?
- Comment placer un convertisseur sur un formateur ?
- Comment créer un bouton fléché ?
- Comment peupler un bouton fléché ?
- Comment récupérer la valeur d'un bouton fléché ?
- Comment modifier la valeur d'un bouton fléché ?
- Comment restreindre l'édition sur un bouton fléché ?
Pour créer un champ d’édition textuel sur une seule ligne, vous devez créer une instance de la classe javafx.scene.control.TextField.
Par exemple :
Code Java : | Sélectionner tout |
final TextField textField = new TextField();
La propriété text de la classe TextField permet de positionner le texte sur le champ ou de savoir quand la valeur a été éditée.
Pour créer un champ d’édition de mot de passe sur une seule ligne, vous devez créer une instance de la classe javafx.scene.control.PasswordField. Les chaines de texte saisies dans cet éditeur seront masquées par un caractère unique.
Par exemple :
Code Java : | Sélectionner tout |
final PasswordField textField = new PasswordField();
La propriété text de la classe PasswordField permet de positionner le texte sur le champ ou de savoir quand la valeur a été éditée.
Les méthodes copy() et cut() ont été surchargées et n'ont aucun effet sur ce contrôle de saisie,
Pour créer une zone d’édition sur de multiples lignes, vous devez créer une instance de la classe javafx.scene.control.TextArea.
Par exemple :
Code Java : | Sélectionner tout |
final TextArea textArea = new TextArea();
La propriété text de la classe TextArea permet de positionner le texte sur le champ ou de savoir quand la valeur a été éditée.
Pour savoir si le contenu d'un champ d’édition a été modifié, il suffit de placer un écouteur de type InvalidationListener ou ChangeListener sur sa propriété text.
Par exemple :
Code Java : | Sélectionner tout |
textField.textProperty().addListener(observable -> System.out.println("Champ d'édition modifié !"));
Il est possible de modifier le texte dans un champ d’édition via plusieurs méthodes d’édition prêtes à l'emploi :
- clear() - supprime tout le texte ;
- deleteNextChar() - cette méthode supprime le caractère situé après le curseur de saisie ;
- deletePreviousChart() - cette méthode supprime le caractère situé avant le curseur de saisie ;
- deleteText() - cette méthode supprime le texte contenu entre les indices ou l'IndexRange passés en paramètre ;
- insertText() - cette méthode permet d’insérer du texte contenu à l'indice passé en paramètre ;
- replaceSelection() - cette méthode remplace la sélection actuelle par un nouveau contenu ;
- replaceText() - cette méthode permet de remplacer le texte contenu entre les indices ou l'IndexRange passés en paramètre.
Il est également bien sûr possible de modifier directement la valeur de la propriété text. Cependant, il est recommandé de passer par les méthodes indiquées ici de manière à supporter les évolutions ou modifications futures de l'API ou les ports de JavaFX vers d'autres plateformes (ex. : le remplacement du texte sur des plateformes mobiles ou tactiles ou plus modernes pourrait s'accompagner d'animations).
Pour savoir si la sélection dans un champ d’édition a été modifiée, il suffit de placer un écouteur de type InvalidationListener ou ChangeListener sur sa propriété en lecture seule selection.
Par exemple :
Code Java : | Sélectionner tout |
textField.selectionProperty().addListener(observable -> System.out.println("Sélection modifiée dans le champ d'édition !"));
La propriété selection contient une valeur de type javafx.scene.control.IndexRange qui permet de connaitre les indices de début et de fin de sélection et de connaitre sa longueur. Cette valeur ne contient jamais la valeur null et est, par défaut, initialisée à la sélection (0, 0). Un nouvel objet de type IndexRange est créé à chaque changement de sélection.
Il existe plusieurs méthodes prêtes à l'emploi pour modifier la sélection dans un champ d’édition :
- deselect() - supprime toute sélection ;
- selectAll() - sélectionne tout le texte ;
- selectBackward() - sélectionne un caractère en arrière en déplaçant le curseur de saisie (suivant la position du curseur de saisie par rapport à la sélection actuelle, peut désélectionner un caractère) ;
- selectEnd() - sélectionne depuis la position actuelle jusqu’à la fin du texte tout en déplaçant le curseur de saisie ;
- selectEndOfNextWord() - sélectionne depuis la position actuelle jusqu’à la fin du prochain mot tout en déplaçant le curseur de saisie ;
- selectForward() - sélectionne un caractère en avant en déplaçant le curseur de saisie (suivant la position du curseur de saisie par rapport à la sélection actuelle, peut désélectionner un caractère) ;
- selectHome() - sélectionne depuis la position actuelle jusqu’au début du texte sans en déplacer le curseur de saisie ;
- selectNextWord() - sélectionne depuis la position actuelle jusqu’au début du prochain mot tout en déplaçant le curseur de saisie ;
- selectPositionCaret() - sélectionne depuis le point actuel et positionne le curseur de saisie à l'endroit indiqué ;
- selectPreviousWord() - sélectionne depuis la position actuelle jusqu’au début du mot précédent tout sans déplacer le curseur de saisie ;
- selectRange() - sélectionne l'intervalle spécifié et déplace le curseur de saisie à la fin de cet intervalle.
Pour copier la sélection actuelle d'un champ d’édition dans le presse-papier, il suffit d'appeler la méthode copy() du champ d’édition.
Par exemple :
Code Java : | Sélectionner tout |
textField.copy();
si la sélection est vide, la valeur du presse-papier ne sera pas modifiée.
Pour couper la sélection actuelle d'un champ d’édition (c'est-à-dire copier sa valeur dans le presse-papier, puis effacer la sélection), il suffit d'appeler la méthode cut() du champ d’édition.
Par exemple :
Code Java : | Sélectionner tout |
textField.cut();
si la sélection est vide, la valeur du presse-papier ne sera pas modifiée.
Pour coller le contenu du presse-papier dans un champ d’édition, il suffit d'appeler la méthode paste() du champ d’édition. Ceci remplacera la sélection actuelle s'il y en a une, sinon le nouveau contenu sera inséré à l'emplacement du curseur de saisie.
Par exemple :
Code Java : | Sélectionner tout |
textField.paste();
Pour savoir si la position du curseur de saisie d'un champ d'édition a été modifiée, il suffit de placer un écouteur de type InvalidationListener ou ChangeListener sur sa propriété en lecture seule caretPosition.
Par exemple :
Code Java : | Sélectionner tout |
textField.caretPositionProperty().addListener(observable -> System.out.println("Position du curseur d’édition modifiée dans le champ d'édition !"));
Outre les diverses méthodes qui permettent de changer la sélection dans un champ d’édition, il est possible de spécifier la position du curseur de saisie en appelant la méthode positionCaret() et en lui passant un nouvel indice en paramètre.
Par exemple :
Code Java : | Sélectionner tout |
textField.positionCaret(10);
Invoquer cette méthode supprimera la sélection actuelle.
Pour désactiver la saisie sur un contrôle de saisie, vous devez mettre sa propriété editable à la valeur false.
Par exemple :
Code Java : | Sélectionner tout |
textField.setEditable(false);
Cela désactivera toute saisie au clavier, au clavier virtuel ou via le menu contextuel du contrôle.
Pour afficher un texte par défaut ou une invite sur un contrôle de saisie, vous devez spécifier une valeur sur sa propriété promptText.
Par exemple :
Code Java : | Sélectionner tout |
loginField.setPromptText("Nom d'utilisateur");
Ce texte s'affichera uniquement quand le contrôle de saisie ne contient aucun texte.
Pour procéder à une validation lorsque l'utilisateur appuie sur la touche « Entrée » après avoir saisi son mot de passe, vous devez fournir un callback de type EventHandler<ActionEvent> dans la propriété onAction du champ de saisie de mots de passe.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | final PasswordField passwordField = new PasswordField(); passwordField.setPromptText("Mot de passe"); passwordField.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { // Validation du mot de passe. // Réaction en cas de mot de passe valide. // Réaction en cas de mot de passe non valide. passwordField.clear(); } }); |
Ou :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 | final PasswordField passwordField = new PasswordField(); passwordField.setPromptText("Mot de passe"); passwordField.setOnAction(actionEvent -> { // Validation du mot de passe. // Réaction en cas de mot de passe valide. // Réaction en cas de mot de passe non valide. passwordField.clear(); }); |
Note : c'est une bonne pratique que de vider le contenu du contrôle de saisie une fois la validation terminée.
Pour forcer le retour à la ligne dans une instance de TextArea, vous devez modifier la valeur de sa propriété wrapText et la mettre à la valeur true.
Par exemple :
Code Java : | Sélectionner tout |
textArea.setWrapText(true);
JavaFX met à disposition un clavier virtuel pour les champs de saisie lorsqu'une application s’exécute sur une plateforme embarquée.
Il est possible d'activer le clavier virtuel sur un ordinateur de bureau en utilisant le paramètre suivant de la JVM :
Code : | Sélectionner tout |
-Dcom.sun.javafx.virtualKeyboard=javafx
Un clavier tactile s'affichera à l’écran dès qu'un contrôle de saisie gagnera le focus.
Pour le moment, il semble que JavaFX ne supporte que les claviers virtuels QWERTY.
Il est possible de spécifier le type de clavier virtuel à utiliser sur un contrôle de saisie en modifiant la valeur attachée à la clé "vkType" dans les propriétés du contrôle de saisie. À l'heure actuelle, les valeurs suivantes sont admises :
- "numeric" - un clavier numérique ne contenant que des chiffres ;
- "url" - un clavier destiné à saisir des URL web ;
- "email" - un clavier destiné à saisir des adresses mél ;
- "text" - le clavier par défaut.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 | final TextField emailField = new TextFiel(); emailField.setPromptText("Adresse mél"); emailField.getProperties().put("vkType", "email"); |
Ici, un clavier paramétré pour saisir des adresses mél sera affiché à l’écran lorsque le champ de saisie emailField aura le focus.
À partir du JDK8_40, vous pouvez restreindre l’édition sur un contrôle de saisie en spécifiant une valeur de type javafx.scene.control.TextFormatter<V> dans sa propriété textFormatter.
Par exemple :
Code Java : | Sélectionner tout |
textField.setTextFormatter(integerOnlyFormatter);
La classe TextFormatter permet d'effectuer deux fonctions distinctes :
- le filtrage des modifications apportées au contenu du contrôle de saisie (ex. : éviter la saisie de certains caractères) ;
- convertir le texte saisi dans le contrôle par l'utilisateur en une valeur de type V qui sera contenue dans la propriété value du formateur. Dans le cas où le programmeur modifie la propriété value du formateur, celui-ci convertira alors la valeur en texte à afficher dans le contrôle de saisie.
Il est possible d'avoir un formateur qui supporte l'une ou l'autre de ces fonctions ou les deux en fonction du constructeur de la classe que vous utiliserez.
Note : si jamais le formateur ne dispose pas de convertisseur, une exception de type IllegalStateException sera levée lorsque la méthode setValue() est invoquée et sa propriété value est toujours à la valeur null.
Attention : il n'est pas possible de partager une même instance d'un formateur entre plusieurs contrôles de saisie.
Pour placer un filtre sur un formateur, vous devez, lors de son initialisation, lui fournir une instance de l'interface java.util.function.UnaryOperator<TextFormatter.Change> dans un de ses constructeurs. Vous devez implémenter la méthode apply() de l’opérateur unaire pour implémenter le filtrage.
Dans le corps de cette méthode, vous pouvez tester les caractères saisis dans le champ d’édition et valider ou non la modification en fonction de l'objet change reçu en paramètre de la méthode. Si la modification doit être invalidée, il vous suffit de retourner la valeur null. Dans le cas contraire, si la modification doit être validée, vous pouvez retourner l'objet change directement.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | final UnaryOperator<TextFormatter.Change> integerOnlyFilter = new UnaryOperator<TextFormatter.Change>() { @Override public TextFormatter.Change apply(TextFormatter.Change change) { final String text = change.getText(); return (text.isEmpty() || text .matches("[0-9]")) ? change : null; } }; final TextFormatter<Integer> integerOnlyFormatter = new TextFormatter(integerOnlyFilter); |
Ou :
Code Java : | Sélectionner tout |
1 2 3 4 5 | final UnaryOperator<TextFormatter.Change> integerOnlyFilter = change -> { final String text = change.getText(); return (text.isEmpty() || text .matches("[0-9]")) ? change : null; }; final TextFormatter<Integer> integerOnlyFormatter = new TextFormatter(integerOnlyFilter); |
Ici, nous rejetons tout caractère qui n'est pas un chiffre, il est donc désormais impossible de saisir dans le champ d’édition des lettres, symboles, etc. Nous acceptons cependant les modifications qui ne contiennent pas de texte de manière à permettre les changements de position du curseur de saisie ou de sélection de texte dans le champ d’édition. Nous avons donc créé un filtre qui ne permet de saisir que des nombres entiers positifs.
Il est possible de retrouver le texte d'origine non modifié du contrôle d’édition en invoquant la méthode getControlText() de l'objet change reçu en paramètre de la méthode.
De plus, il est également possible de connaitre la valeur future du texte contrôle d’édition en cas de validation de la modification en invoquant la méthode getControlNewText() de l'objet change reçu en paramètre de la méthode.
Note : un même filtre peut être utilisé par plusieurs formateurs.
Pour placer un convertisseur sur un formateur, vous devez, lors de son initialisation, lui fournir une instance de la classe abstraite javafx.util.StringConverter<T> dans un de ses constructeurs. Vous devez implémenter les méthodes fromString() et toString() de la classe pour convertir une chaine de caractères provenant du contrôle de saisie en objet de type T ou un objet de type T en texte à afficher dans le contrôle de saisie.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | final StringConverter<Integer> integerConverter = new StringConverter<Integer>() { @Override public String toString(Integer value) { return (value == null) ? null : value.toString(); } @Override public Integer fromString(String text) { return (text == null || text.trim().isEmpty()) ? null : Integer.parseInt(text.trim()); } }; final TextFormatter<Integer> integerOnlyFormatter = new TextFormatter(integerConverter, 0, integerOnlyFilter); |
Ici, nous avons placé dans notre formateur un convertisseur qui permet de générer et d'utiliser des nombres entiers. Nous avons également spécifié la valeur par défaut dans le formateur. Nous avons également utilisé le filtre précédemment créé.
La méthode fromString() du convertisseur est invoquée lorsque l'utilisateur tente de valider le contenu de son champ d’édition, par exemple en appuyant sur la touche ENTRÉE à la fin de la saisie ou lorsque le champ d’édition perd le focus lorsqu'on a cliqué ailleurs dans l'interface ou qu'on utilise une touche pour changer le contrôle actif (ex. : la touche Tabulation).
La méthode toString() du convertisseur est invoquée lorsque le programmeur utilise le setter de la propriété value du formateur.
Note : un même convertisseur peut être utilisé par plusieurs formateurs.
À partir du JDK8_40, pour créer un bouton fléché (spinner en anglais), il vous faut créer une instance de la classe javafx.scene.control.Spinner<T>. Ici, T est le type des instances contenues dans le spinner.
Par exemple :
Code Java : | Sélectionner tout |
final Spinner spinner = new Spinner();
Cependant l'instance de la classe Spinner ainsi créée est vide et n'accepte aucune valeur, car elle n'est pas éditable.
Vous pouvez permettre la modification de la valeur du bouton fléché en modifiant la valeur de sa propriété editable et en lui donnant la valeur true.
Code Java : | Sélectionner tout |
spinner.setEditable(true);
Pour peupler un bouton fléché, vous pouvez l'initialiser en lui passant une liste de valeurs potentielles lors de sa création :
- il est possible de passer au constructeur une ObservableList<T> contenant les instances des valeurs légales pour le spinner.
Par exemple :Code Java : Sélectionner tout final Spinner<String> spinner = new Spinner(FXCollections.observableArrayList("Fabrice", "John", "Pierre"));
Ici, le bouton fléché contient des chaines de caractères prédéfinies et sa valeur initiale est « Fabrice ». Il est possible d'utiliser les flèches haut et bas pour naviguer entre les valeurs.
Attention : si le bouton est éditable, il est possible de saisir de nouvelles valeurs, cependant celles-ci ne seront pas automatiquement rajoutées dans la liste des valeurs prédéfinies. - Dans le cas de nombres entiers ou de nombres flottants, il est possible de spécifier une plage de valeurs légales.
Par exemple :Code Java : Sélectionner tout final Spinner<Integer> spinner = new Spinner(0, 10, 5);
Ou encore :Code Java : Sélectionner tout final Spinner<Double> spinner = new Spinner(0d, 10d, 5d);
Ici, le bouton fléché contient la valeur initiale 5 et permet de naviguer dans une plage de valeurs comprises entre 0 et 10 par incrément de 1.
Il est cependant possible de spécifier le pas d’incrément dans le constructeur :
Par exemple :Code Java : Sélectionner tout final Spinner<Integer> spinner = new Spinner(0, 10, 5, 2);
Ou encore :Code Java : Sélectionner tout final Spinner<Double> spinner = new Spinner(0d, 10d, 5d, 2d);
Ici, le bouton fléché contient la valeur initiale 5 et permet de naviguer dans une plage de valeurs comprises entre 0 et 10 par incrément de 2.
Attention : si le bouton est éditable, il est possible de saisir de nouvelles valeurs, y compris des valeurs qui ne sont pas des nombres ou qui sont en dehors de la plage de nombres indiquée. - Enfin, il est possible de spécifier une usine à valeurs (value factory en anglais) en passant en paramètre du constructeur une instance de la classe javafx.scene.control.SpinnerValueFactory<T>. Il est également possible de spécifier une usine à valeurs en modifiant la valeur de la propriété valueFactory du bouton fléché.
Il vous suffit alors de surcharger les méthodes decrement() et increment() de cette classe de manière à modifier le contenu sa propriété value ce qui modifiera la valeur contenue dans le spinner.
Par exemple :Code Java : Sélectionner tout 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18final Spinner<Integer> spinner = new Spinner(new SpinnerValueFactory() { @Override public void decrement(int steps) { // Décrémenter la valeur ici. final Integer value = (Integer)getValue(); final int val = (value == null) ? 0 : value; setValue(val - steps); } @Override public void increment(int steps) { // Incrementer la valeur ici. final Integer value = (Integer)getValue(); final int val = (value == null) ? 0 : value; setValue(val + steps); } });
Ici, nous créons une fabrique à valeurs entières. Cependant, comme nous n'avons pas spécifié de valeur initiale, le bouton fléché est initialement vide. Pour pallier ce problème, il nous faudrait également surcharger le constructeur de la classe anonyme.
Par exemple :Code Java : Sélectionner tout 1
2
3
4
5
6
7final Spinner<Integer> spinner = new Spinner(new SpinnerValueFactory() { { setValue(5); } [...] });
Ici, le bouton fléché est initialisé à la valeur 5.
Utiliser une telle fabrique permet par exemple de faire un spinner permettant de naviguer à travers un ensemble infini de valeurs numériques, d'avoir un pas d’incrément non linéaire (ex. : passé une certaine valeur on saute de 10 en 10, puis de 100 en 100, etc.) ou encore de récupérer des valeurs en effectuant une requête web ou auprès d'une base de données.
La classe SpinnerValueFactory dispose de plusieurs implémentations/classes filles statiques prêtes à l'emploi telles que IntegerSpinnerValueFactory, etc.
Attention : une fois de plus, si le bouton fléché est éditable, il peut accepter n'importe quelle valeur, même celles qui ne sont pas générées par l'usine à valeurs.
Pour récupérer la valeur d'un bouton fléché, vous pouvez accéder à sa propriété en lecture seule value.
Par exemple :
Code Java : | Sélectionner tout |
final Integer value = spinner.getValue();
Vous ne pouvez pas directement modifier la valeur d'un bouton fléché. Cependant, vous pouvez invoquer ses méthodes increment() et decrement() pour que le bouton interroge son usine à valeurs de manière à produire une nouvelle valeur qui sera alors appliquée au bouton. Il est possible de fournir un pas lorsqu'on invoque une de ces méthodes.
Par exemple :
Code Java : | Sélectionner tout |
spinner.increment();
Ou :
Code Java : | Sélectionner tout |
spinner.decrement(10);
Évidemment, il reste possible d'invoquer directement la méthode setValue() sur l'usine à valeurs du spinner :
Code Java : | Sélectionner tout |
spinner.getValueFactory().setValue(5);
Pour restreindre l'édition sur un bouton fléché, vous devez spécifier un formateur dans la propriété textFormatter de l’éditeur du bouton fléché.
Par exemple :
Code Java : | Sélectionner tout |
spinner.getEditor().setTextFormatter(integerOnlyFormatter);
Désormais, notre spinner ne permettra que la saisie de nombres entiers positifs.
- Comment restreindre l'édition sur un contrôle de saisie ? dans la FAQ JavaFX
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.