Bonjour, situons mon problème.
J'ai une fenêtre principale dans laquelle j'ai une TableView de deux colonnes, un Label pour afficher qu'un ajout vient d'être fait, un Button qui permet d'ouvrir une boîte de dialogue.
Cette boîte de dialogue contient 2 TextField et un Button.
Ce que je cherche à faire : lorsque je clique sur le bouton "ajouter" de ma boîte de dialogue, je veux ajouter dans la table de ma fenêtre principale les valeurs de deux champs de ma boîte de dialogue et en plus mofifier le label de ma fenêtre principale pour informer d'un ajout dans la table.
J'ai fait un simple programme pour illustrer mon problème. Le code fournit fonctionne pour afficher la fenêtre principale et afficher la boîte de dialogue suite au clic du bouton de la fenêtre principale. Il ne permet pas d'ajouter des informations dans la table ni de mettre à jours le label.
On comprend bien ici qu'il faut trouver un moyen de communiquer entre ces deux fenêtres en sachant que chaque fenêtre a une classe "controller" propre et un fichier fxml propre.
J'ai voulu essayer de créer un objet de type "DialogController" dans ma classe "MainWindowController" en passant en paramètre "this" pour pouvoir communiquer entre les deux objets. Cela ne fonctionne pas et je dois avouer que je ne sais pas vraiment pourquoi.
J'ai aussi essayé d'autres choses qui tiennent plus d'un bricolage bancale que de quelque chose de propre.
Je met le code exemple à disposition. Ce que j'ai essayé de faire est en commentaire sous la forme /**/. Je n'ai pas commenté le reste du code car il est très simple et les noms de variables sont parlants.
Fichier principal.
Contrôleur de la fenêtre principale.
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 import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; public class MyApp extends Application{ public static void main(String[] args){ Application.launch(MyApp.class, (java.lang.String[]) null); } @Override public void start(Stage primaryStage) throws Exception { AnchorPane page = FXMLLoader.load(MyApp.class.getResource("mainWindow.fxml")); Scene scene = new Scene(page); primaryStage.setScene(scene); primaryStage.setTitle("Communication entre 2 contrôleurs"); primaryStage.show(); } }
Contrôleur de la boîte de dialogue.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Modality; import javafx.stage.Stage; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; public class MainWindowController implements Initializable { //FIELDS @FXML private Button newFruitButton; @FXML private Label addedFruitLabel; @FXML private TableView<Fruit> fruitTable; @FXML private TableColumn<Fruit, String> nameColumn; @FXML private TableColumn<Fruit, String> colorColumn; final ObservableList<Fruit> data = FXCollections.observableArrayList(); /** * DialogController dialogController; */ //CONSTRUCTOR public MainWindowController(){ /** * this.dialogController = new DialogController(this); */ this.data.add(new Fruit("Pomme", "Vert")); this.data.add(new Fruit("Poire", "Jaune")); this.data.add(new Fruit("Banane", "Jaune")); this.data.add(new Fruit("Orange", "Orange")); } //METHODS @Override public void initialize(URL url, ResourceBundle rb) { this.nameColumn.setCellValueFactory(new PropertyValueFactory<>("name")); this.colorColumn.setCellValueFactory(new PropertyValueFactory<>("color")); this.fruitTable.setItems(this.data); } @FXML private void onNewFruitButtonClicked(ActionEvent event) throws IOException { Stage stage = new Stage(); stage.setTitle("New fruit dialog"); stage.setScene(new Scene(FXMLLoader.load(getClass().getResource("dialog.fxml")))); stage.initModality(Modality.WINDOW_MODAL); stage.initOwner(((Node) event.getSource()).getScene().getWindow()); stage.show(); } }
FXML de la fenêtre principale.
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 import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.TextField; import java.net.URL; import java.util.ResourceBundle; public class DialogController implements Initializable { //FIELDS @FXML TextField nameEntry; @FXML TextField colorEntry; @FXML Button addButton; /** * private MainWindowController mainWindowController; */ //CONSTRUCTOR /** * public DialogController(MainWindowController mainWindowController) { * this.mainWindowController = mainWindowController; * } */ //METHODS @Override public void initialize(URL location, ResourceBundle resources) {} @FXML private void onAddButtonClicked(){ /** * Ajout d'un fruit dans la table. * * mainWindowController.data.add(new Fruit("Kiwi", "Vert")); */ /** * Mise à jours du label de la fenetre principale pour indiquer un ajout dans la table. * * mainWindowController.addedFruitLabel.setText( * this.nameEntry.getText().toString()+" "+this.colorEntry.getText().toString()+" a été ajouté."); */ } }
FXML de la boîte de dialogue
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 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="282.0" prefWidth="487.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainWindowController"> <children> <TableView fx:id="fruitTable" layoutX="14.0" layoutY="14.0" prefHeight="250.0" prefWidth="250.0"> <columns> <TableColumn fx:id="nameColumn" prefWidth="123.0" text="Name" /> <TableColumn fx:id="colorColumn" prefWidth="114.0" text="Color" /> </columns> </TableView> <Button fx:id="newFruitButton" layoutX="353.0" layoutY="14.0" mnemonicParsing="false" onAction="#onNewFruitButtonClicked" text="Ajouter un fruit" /> <Label fx:id="addedFruitLabel" layoutX="300.0" layoutY="71.0" prefHeight="16.0" prefWidth="172.0" /> </children> </AnchorPane>
Classe permettant de gérer les donner de la TableView.
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 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="156.0" prefWidth="325.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="DialogController"> <children> <TextField fx:id="nameEntry" layoutX="137.0" layoutY="19.0" /> <Label layoutX="17.0" layoutY="24.0" text="Nom du fruit :" /> <Label layoutX="17.0" layoutY="65.0" text="Couleur du fruit :" /> <TextField fx:id="colorEntry" layoutX="136.0" layoutY="62.0" /> <Button fx:id="addButton" layoutX="245.0" layoutY="113.0" mnemonicParsing="false" onAction="#onAddButtonClicked" text="Ajouter" /> </children> </AnchorPane>
N'hésitez pas à faire des remarques sur ce code et à donner des pistes.
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 import javafx.beans.property.*; public class Fruit { //FIELDS private final SimpleStringProperty name; private final SimpleStringProperty color; //CONSTRUCTOR public Fruit(String name, String color){ this.name = new SimpleStringProperty(name); this.color = new SimpleStringProperty(color); } //METHODS : getters and setters public String getName(){return this.name.get();} public void setName(String name){this.name.set(name);} public String getColor(){return this.color.get();} public void setColor(String color){this.color.set(color);} }
Merci d'avance.
PS : vous trouverez aussi les sources en pièce jointe si vous ne voulez pas faire du copier/coller. Le code compile avec ce jdk : jdk-8u45.
Partager