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 !
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.
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Merci de penser au tagquand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.
suivez mon blog sur Développez.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook
Partager