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 sélectionner un répertoire ?
- Comment sélectionner un fichier ?
- Comment spécifier des filtres de fichiers ?
- Comment spécifier le filtre de fichiers par défaut ?
- Comment spécifier le fichier par défaut ?
- Comment spécifier le répertoire initial ?
- Est-ce que JavaFX permet de manipuler des boites de dialogue ?
- Comment récupérer le résultat d'une boite de dialogue ?
- Comment afficher une alerte ?
- Comment afficher une liste de choix ?
- Comment afficher une zone de saisie ?
- Comment créer une boite de dialogue customisée ?
Pour sélectionner un répertoire, par exemple en réaction à un clic sur un bouton, il faut créer une instance de la classe javafx.stage.DirectoryChooser, qui permettra d'afficher une boite de dialogue de sélection de répertoires en invoquant sa méthode showDialog().
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 | final Button button = new Button("Cliquer"); button.setOnAction(actionEvent -> { final DirectoryChooser dialog = new DirectoryChooser(); final File directory = dialog.showDialog(button.getScene().getWindow()); if (directory != null) { // Effectuer le traitement. } }); |
Lorsqu'elle est invoquée, cette méthode fait surgir une boite de dialogue de sélection de répertoires dont l'apparence et le fonctionnement dépendent du système d'exploitation sur lequel tourne l'application.
Cette méthode prend en paramètre une instance de la classe Window qui lui sert de fenêtre d'ancrage. Cette valeur peut être égale à null.
Cette méthode retourne une instance de la classe java.io.File qui contient le répertoire sélectionné par l'utilisateur. Cette valeur est null si l'utilisateur a refermé la boite de dialogue sans sélectionner de répertoire.
Pour sélectionner un fichier, par exemple en réaction à un clic sur un bouton, il faut créer une instance de la classe javafx.stage.FileChooser, qui permettra d'afficher une boite de dialogue de sélection de fichiers en invoquant sa méthode showOpenDialog() (pour l'ouverture) ou sa méthode showSaveDialog() (pour la sauvegarde).
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 | final Button button = new Button("Cliquer"); button.setOnAction(actionEvent -> { final FileChooser dialog = new FileChooser(); final File file = dialog.showSaveDialog(button.getScene().getWindow()); if (file != null) { // Effectuer la sauvegarde. } }); |
Lorsqu'elle est invoquée, cette méthode fait surgir une boite de dialogue de sélection de fichiers dont l'apparence et le fonctionnement dépendent du système d'exploitation sur lequel tourne l'application.
Cette méthode prend en paramètre une instance de la classe Window qui lui sert de fenêtre d'ancrage. Cette valeur peut être égale à null.
Cette méthode retourne une instance de la classe java.io.File qui contient le fichier sélectionné par l'utilisateur. Cette valeur est null si l'utilisateur a refermé la boite de dialogue sans sélectionner de fichier.
Dans le cas où il est nécessaire de sélectionner plusieurs fichiers, il est possible d'invoquer la méthode showOpenMultipleDialog() qui retourne une instance de List<File> contenant tous les fichiers sélectionnés par l’utilisateur. Cette méthode retourne également null si l'utilisateur a refermé la boite de dialogue sans sélectionner de fichier.
Pour spécifier des filtres de fichiers, il faut créer de nouvelles instances de la classe javafx.stage.FileChooser.ExtensionFilter et les ajouter dans la liste observable extensionFilters de la boite de dialogue de sélection de fichiers.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | final Button button = new Button("Cliquer"); button.setOnAction(actionEvent -> { final FileChooser dialog = new FileChooser(); dialog.getExtensionFilters().setAll(new FileChooser.ExtensionFilter("Fichiers texte", "*.txt", "*.text"), new FileChooser.ExtensionFilter("Tous les fichiers", "*.*")); final File file = dialog.showSaveDialog(button.getScene().getWindow()); if (file != null) { // Effectuer la sauvegarde. } }); |
Pour créer un nouveau filtre, il suffit de fournir une description et une suite d'extensions de fichier qui seront utilisées pour filtrer l'affichage.
Pour retirer des filtres, il suffit de les retirer de la liste observable extensionFilters de la boite de dialogue de sélection de fichiers.
Pour spécifier le filtre de fichiers par défaut, il faut modifier la valeur de la propriété selectedExtensionFilter de la boite de dialogue de sélection de fichiers.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 | final FileChooser.ExtensionFilter textFilter = new FileChooser.ExtensionFilter("Fichiers texte", "*.txt", "*.text"); final FileChooser.ExtensionFilter rtfFilter = new FileChooser.ExtensionFilter("Document texte riche", "*.rtf"); final FileChooser.ExtensionFilter docFilter = new FileChooser.ExtensionFilter("Microsoft Word", "*.doc", "*.docx"); dialog.getExtensionFilters().setAll(textFilter, rtfFilter, docFilter); dialog.setSelectedExtensionFilter(rtfFilter); |
Lorsque la boite de dialogue a été validée, il est possible de connaitre le filtre qui a été sélectionné par l'utilisateur en inspectant la valeur de cette propriété.
Il est possible de spécifier le fichier par défaut en modifiant la valeur de la propriété initialFileName de la boite de dialogue de sélection de fichiers.
Les classes FileChooser et DirectoryChooser permettent toutes les deux de spécifier le répertoire initial dans lequel s'ouvre la boite de dialogue en modifiant la valeur de leur propriété initialDirectory avant d'afficher la boite de dialogue.
À partir du JDK8_40, JavaFX dispose d'une API permettant d'afficher et de manipuler des boites de dialogue. Cette API se compose de deux parties :
- une API de haut niveau qui permet de créer et d'afficher des boites de dialogue prêtes à l'emploi rapidement (message d'information, erreur, etc.) en utilisant les classes javafx.scene.control.Alert, javafx.scene.control.ChoiceDialog<R> et javafx.scene.control.TextInputDialog :
- Alert - affiche des messages à l'utilisateur,
- ChoiceDialog<R> - permet à l'utilisateur de choisir dans une plage de valeurs de type R,
- TextInputDialog - permet à l'utilisateur de saisir du texte ;
- une API de bas niveau qui permet de construire ses propres boites de dialogue, spécifier les boutons à montrer, etc. en utilisant la classe javafx.scene.control.Dialog<R>.
Les classes spécialisées de boites de dialogue (Alert, etc.) héritent de la classe Dialog<R>, elles contiennent donc les méthodes qui permettent de spécifier son style ou encore d'attacher la boite de dialogue à une fenêtre parente.
Ici, R est le type de retour de la boite de dialogue, ex. : le type de retour des alertes est javafx.scene.control.ButtonType, une classe utilitaire qui représente des boutons prédéfinis ; tandis que le type de retour de TextInputDialog est String, car cette boite de dialogue attend une saisie de l'utilisateur.
Vous pouvez cependant créer des boites de dialogue qui permettent d'instancier d'autres types lorsque vous les validez (ex. : un assistant de création de connexion vers une base de données retournera un objet paramètres contenant la configuration qui sera fournie à la classe métier en charge d’établir la connexion).
La façon de récupérer le résultat d'une boite de dialogue de type Dialog<R> dépend de la manière dont vous l'avez affichée :
- showAndWait() - cette méthode est bloquante tant que la boite de dialogue ou l'alerte n'est pas fermée. Elle retourne alors une instance de type Optional<R> qui n'est jamais à la valeur null et qui contient la valeur de retour de la boite de dialogue ;
Par exemple, dans le cas d'une alerte :Code Java : Sélectionner tout 1
2
3
4
5
6final Optional<ButtonType> result = alert.showAndWait(); result.ifPresent(button -> { if (button == ButtonType.OK) { [...] } });
Ici, dans le cas d'une alerte, la valeur retournée est donc de type ButtonType. Lorsque la fenêtre de l'alerte est fermée sans utiliser de bouton de validation, c'est la valeur ButtonType.CLOSE qui est contenue dans le résultat optionnel.
Dans certains cas, notamment lorsque votre boite de dialogue est amenée à construire ses propres réponses, la valeur contenue dans le résultat optionnel peut être null ; - show() - cette méthode n'est pas bloquante et retourne immédiatement sans fournir de résultat. Le programmeur doit alors attacher un écouteur de type InvalidationListener ou ChangeListener sur la propriété result de la boite de dialogue.
Par exemple, dans le cas d'une alerte :Code Java : Sélectionner tout 1
2
3
4
5
6
7
8
9
10alert.resultProperty().addListener(new ChangeListener<ButtonType>() { @Override public void changed(ObservableValue<? extends ButtonType> observableValue, ButtonType oldValue, ButtonType newValue) { if (newValue == ButtonType.OK) { [...] } } }); alert.show();
Ou :Code Java : Sélectionner tout 1
2
3
4
5
6alert.resultProperty().addListener((ObservableValue<? extends ButtonType> observableValue, ButtonType oldValue, ButtonType newValue) -> { if (newValue == ButtonType.OK) { [...] } }); alert.show();
Ici, la méthode show() retourne immédiatement et nous réagissons au choix de l'utilisateur dans le code de l’écouteur.
Vous pouvez facilement afficher des boites de dialogue en manipulant la classe javafx.scene.control.Alert qui permet d'utiliser l'API de boites de dialogue de haut niveau.
Par exemple :
Code Java : | Sélectionner tout |
1 2 | final Alert alert = new Alert(Alert.AlertType.NONE); alert.show(); |
Ici, nous affichons une boite de dialogue (qu'il n'est pas possible de fermer) en mode non bloquant : c'est-à-dire que le code continue à s’exécuter après l'invocation de la méthode show(). Il est possible d'afficher une boite de dialogue en mode bloquant en utilisant la méthode showAndWait() : l’exécution du code est stoppée jusqu’à ce que la boite de dialogue soit fermée.
Il est possible de spécifier un type prédéfini de boite de dialogue en donnant au constructeur un paramètre de type Alert.AlertType :
- AlertType.CONFIRMATION - pour demander une confirmation à l'utilisateur ;
- AlertType.ERROR - pour rapporter une erreur ;
- AlertType.INFORMATION - pour afficher une information ;
- AlertType.NONE - boite de dialogue sans spécialisation particulière ;
- AlertType.WARNING - pour rapporter un avertissement.
L'apparence de l'alerte (icône, couleur, nombre de boutons, texte sur les boutons, etc.) change en fonction de ce paramètre.
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | final Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.initOwner(stage); alert.setTitle("Demande de confirmation"); alert.setHeaderText("Un fichier du même nom existe déjà."); alert.setContentText("Souhaitez-vous écraser le fichier destination ?"); final Optional<ButtonType> result = alert.showAndWait(); result.ifPresent(button -> { if (button == ButtonType.OK) { [...] } }); |
Ici, nous allons affichons une alerte demandant confirmation à l'utilisateur avant d’écraser un fichier.
Vous pouvez facilement afficher des boites de dialogue contenant une liste de choix en manipulant la classe javafx.scene.control.ChoiceDialog<R>. Ce type de boites de dialogue affiche une liste déroulante contenant des objets de type R qui permet à l'utilisateur de sélectionner une valeur avant de valider la boite de dialogue avec le bouton « OK ».
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | final List<Integer> seats = Arrays.asList(1, 2, 3, 4); final ChoiceDialog<Integer> dialog = new ChoiceDialog(seats.get(0), seats); dialog.setTitle("Réservation"); dialog.setHeaderText("Nombre de convives"); dialog.setContentText("Table pour"); final Optional<Integer> result = dialog.showAndWait(); result.ifPresent(guestNumber -> { [...] }); |
Il est possible d'observer les changements de sélection avant validation en plaçant un écouteur de type InvalidationListener ou ChangeListener sur la propriété en lecture seule selectedItem de la boite de dialogue.
Vous pouvez facilement afficher une zone de saisie en manipulant la classe javafx.scene.control.TextInputDialog. Ce type de boite de dialogue affiche champ d’édition qui permet à l'utilisateur de saisir une valeur avant de valider la boite de dialogue avec le bouton « OK ».
Par exemple :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 | final TextInputDialog dialog = new TextInputDialog(); dialog.setTitle("Réservation"); dialog.setHeaderText("Nombre de convives"); dialog.setContentText("Table pour"); final Optional<String> result = dialog.showAndWait(); result.ifPresent(guestString -> { [...] }); |
Il est possible d'observer les changements d’édition avant validation en plaçant un écouteur de type InvalidationListener ou ChangeListener sur la propriété text de son éditeur.
Note : il est également possible de restreindre l’édition en plaçant un formateur sur l’éditeur.
Par exemple :
Code Java : | Sélectionner tout |
dialog.getEditor().setTextFormatter(integerOnlyFormatter);
- Comment restreindre l'édition sur un contrôle de saisie ? dans la FAQ JavaFX
Nous allons créer une boite de dialogue permettant à un utilisateur de saisir un identifiant et un mot de passe.
Commençons par initialiser la boite de dialogue. Dans cet exemple, le type de retour de notre boite de dialogue sera javafx.util.Pair<String, String>, une classe utilitaire qui permet de stocker deux valeurs, ici deux instances de la classe String (l'identifiant et le mot de passe).
Code Java : | Sélectionner tout |
1 2 3 | final Dialog<Pair<String, String>> dialog = new Dialog(); dialog.setTitle("Connexion"); dialog.setHeaderText("Veuillez saisir vos identifiants"); |
Ici, nous allons créer un nouveau type de bouton qui fonctionne comme un bouton OK mais avec un label différent :
Code Java : | Sélectionner tout |
1 2 3 | // Définition des nouveaux types de bouton. final ButtonType loginButtonType = new ButtonType("Connexion", ButtonData.OK_DONE); dialog.getDialogPane().getButtonTypes().addAll(loginButtonType, ButtonType.CANCEL); |
Vient ensuite le moment de créer l'IU qui sera affichée au cœur de la boite de dialogue :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // Création de l'IU. final GridPane gridPane = new GridPane(); gridPane.setHgap(6); gridPane.setVgap(6); gridPane.setPadding(new Insets(6)); final TextField username = new TextField(); username.setPromptText("Utilisateur"); final PasswordField password = new PasswordField(); password.setPromptText("Mot de passe"); gridPane.add(new Label("Utilisateur :"), 0, 0); gridPane.add(username, 1, 0); gridPane.add(new Label("Mot de passe :"), 0, 1); gridPane.add(password, 1, 1); dialog.getDialogPane().setContent(grid); |
Nous allons rajouter un petit extra : le bouton Connexion sera désactivé tant que l'utilisateur n'a pas saisi un identifiant correct.
Code Java : | Sélectionner tout |
1 2 3 4 5 6 | // Le bouton connexion reste désactivé tant que l'identifiant n'est pas correct. final Node loginButton = dialog.getDialogPane().lookupButton(loginButtonType); loginButton.setDisable(true); username.textProperty().addListener((observable, oldValue, newValue) -> { loginButton.setDisable(newValue.trim().isEmpty()); }); |
Nous allons également demander à ce que le champ d’édition de l’utilisateur récupère le focus :
Code Java : | Sélectionner tout |
1 2 | // On place le focus sur le 1er champ de saisie. Platform.runLater(() -> username.requestFocus()); |
Nous allons maintenant placer un convertisseur de résultat de type Callback<ButtonType, Pair<String, String>> dans la propriété resultConverter de la boite de dialogue. Lorsque l'utilisateur valide le dialogue en activant un des boutons, ce callback, qui prend en paramètre un objet de type ButtonType (le bouton sur lequel l'utilisateur a cliqué) et retourne en résultat un objet de type Pair<String, String> contenant l'identifiant et le mot de passe, sera invoqué de manière à générer l'objet résultat du dialogue. Lorsque l'utilisateur annule la boite de dialogue en la fermant ou en cliquant sur le bouton « Annuler », le convertisseur retournera la valeur null.
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | // Conversion du résultat lors de la validation du dialogue. dialog.setResultConverter(new Callback<ButtonType, Pair<String, String>>() { @Override public Pair<String, String> call(ButtonType dialogButton) { if (dialogButton == loginButtonType) { return new Pair<>(username.getText(), password.getText()); } return null; } }); |
Ou :
Code Java : | Sélectionner tout |
1 2 3 4 5 6 7 | // Conversion du résultat lors de la validation du dialogue. dialog.setResultConverter(dialogButton -> { if (dialogButton == loginButtonType) { return new Pair<>(username.getText(), password.getText()); } return null; }); |
Notre boite de dialogue customisée est enfin complétée et nous pouvons l'afficher et utiliser son résultat comme à l’accoutumée :
Code Java : | Sélectionner tout |
1 2 3 4 | final Optional<Pair<String, String>> result = dialog.showAndWait(); result.ifPresent(usernamePassword -> { [...] }); |
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.