Bonjour,
Je développe un programme GUI avec JavaFX et je me demandait quel était le meilleur moyen d'ouvrir une fenêtre de configuration.
Vaut-il mieux déclarer un nouveau stage ? ou utiliser une boite de dialogue customisée ?
Merci !
Version imprimable
Bonjour,
Je développe un programme GUI avec JavaFX et je me demandait quel était le meilleur moyen d'ouvrir une fenêtre de configuration.
Vaut-il mieux déclarer un nouveau stage ? ou utiliser une boite de dialogue customisée ?
Merci !
Il y a probablement un peu moins de code à taper en ce qui concerne la gestion de l'ouverture/fermeture de la fenêtre en utilisant une boite de dialogue mais c'est relativement kif kif pareil je pense. En général tu vas coder ton écran de config dans un pane quelconque et ensuite que ce soit affiché via un stage, une boite de dialogue ou incrusté dans une UI c'est juste de l'accessoire.
Ok, je voulais savoir si il y avait une pratique meilleure qu'une autre mais semblerait que non :)
Je viens de voir que les boites de dialogues sont assez récente, donc j'ai mis à jour ma jdk et je vais tester ça !
Merci
J'ai une question par rapport aux ButtonType dans un DialogPane, j'en ai rajouté 3 (OK, Cancel, Apply) mais j'aimerais que lorsque j'appuies sur Apply la fenêtre ne se ferme pas.
Voici mon code :
Code:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 package view; import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.control.ButtonType; import javafx.scene.control.DialogPane; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; /** * * @author Phoste */ public class ConfigurationDialogPane extends DialogPane { public ConfigurationDialogPane() { setPrefSize(480, 360); ConfigurationPane configPane = new ConfigurationPane(); getButtonTypes().addAll(ButtonType.OK, ButtonType.APPLY, ButtonType.CANCEL); Button apply = (Button)lookupButton(ButtonType.APPLY); apply.setOnAction(e -> { System.out.println("Apply Button Pressed"); }); setContent(configPane); } private class ConfigurationPane extends VBox { private final Label LABEL_SERVER_URI = new Label("Server URL :"); private final Label LABEL_SERVER_PORT = new Label("Server Port :"); private final TextField serverURI = new TextField(); private final TextField serverPort = new TextField(); public ConfigurationPane() { LABEL_SERVER_URI.setPadding(new Insets(5)); HBox url = new HBox(LABEL_SERVER_URI, serverURI); url.setPadding(new Insets(5)); LABEL_SERVER_PORT.setPadding(new Insets(5)); HBox port = new HBox(LABEL_SERVER_PORT, serverPort); port.setPadding(new Insets(5)); this.getChildren().addAll(url, port); } } }
D'apres la doc et mes tests, tu dois remplacer :
Par :Code:
1
2
3
4 Button apply = (Button)lookupButton(ButtonType.APPLY); apply.setOnAction(e -> { System.out.println("Apply Button Pressed"); });
Car mettre e.consume() dans le setOnAction() ne fonctionne pas, ce qui est normal puisque le callbacks sont invoqués après que les écouteurs et filtres d’événements classiques l'aient été.Code:
1
2
3
4
5 Button apply = (Button)lookupButton(ButtonType.APPLY); apply.addEventFilter(ActionEvent.ACTION, e -> { System.out.println("Apply Button Pressed"); e.consume(); });
Perso, je te conseillerai une approche plutôt dans le style suivant :
Ce qui permettrait :Code:
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
26
27
28
29
30
31
32
33 public class ConfigurationPane extends VBox { private final Label LABEL_SERVER_URI = new Label("Server URL :"); private final Label LABEL_SERVER_PORT = new Label("Server Port :"); private final TextField serverURI = new TextField(); private final TextField serverPort = new TextField(); public ConfigurationPane() { LABEL_SERVER_URI.setPadding(new Insets(5)); HBox url = new HBox(LABEL_SERVER_URI, serverURI); url.setPadding(new Insets(5)); LABEL_SERVER_PORT.setPadding(new Insets(5)); HBox port = new HBox(LABEL_SERVER_PORT, serverPort); port.setPadding(new Insets(5)); this.getChildren().addAll(url, port); } public void showDialog(final Stage parent) { final DialogPane dialogPane = new DialogPane(); dialogPane.setPrefSize(480, 360); dialogPane.getButtonTypes().addAll(ButtonType.OK, ButtonType.APPLY, ButtonType.CANCEL); dialogPane.setContent(this); final Dialog dialog = new Dialog<>(); dialog.setDialogPane(dialogPane); dialog.initOwner(parent); final Button apply = (Button) dialogPane.lookupButton(ButtonType.APPLY); apply.addEventFilter(ActionEvent.ACTION, e -> { System.out.println("Apply Button Pressed"); e.consume(); }); dialog.show(); } }
- De réutiliser / intégrer ton panneau de configuration plus aisément dans une autre partie de l'UI.
- De créer une classe contenant des méthodes utilitaires pour mettre en place les boites de dialogues, que tous tes contrôles pourraient appeler (genre DialogUtils.showDialog(parent, title, content, Set<ButtonType>, Map<ButtonType, EventHandler>)). Ca éviterai de dupliquer toujours le même code tout le temps.
Mais bon la ce n'est que mon avis et c'est très optionnel.