Bonjour,
Je développe un petit client mail avec JavaFX.
Voici ma fenêtre principale (RootLayout), elle est composée comme ceci :
- BorderPane
- un SplitPane vertical qui sépare la liste de dossier (folderList) des deux autres
- dans la partie droite, un autre SplitPane horizontale cette fois, qui sépare la liste de message en haut (messageList) de la visualisation des messages en bas (messageViewer)
Chaque SplitPane fourni chacun deux AnchorPane dans lequel je veux appeler d'autres vues FXML (respectivement folderList, messageList et messageViewer).
J'ai donc créer un contrôleur RootLayoutController, qui charge les trois fichiers FXML de mes sous-vues. Chacun des AnchorPane concerné à un fx:id que je fais correspondre à des champs dans ce contrôleur.
Voici le code de la classe principale, MainApp :
Elle créé la fenêtre, charge le FXML rootLayout et en récupère le contrôleur (RootLayoutController, spécifié dans l'attribut fx:controller)
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 package org.speechmail.client; import java.io.IOException; import org.speechmail.client.views.RootLayoutController; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class MainApp extends Application { private Stage primaryStage; private BorderPane rootLayout; @Override public void start(Stage primaryStage) { this.primaryStage = primaryStage; this.primaryStage.setTitle("Client mail"); initRootLayout(); } /** * Initializes the root layout. */ public void initRootLayout() { try { FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("views/fxml/RootLayout.fxml")); this.rootLayout = (BorderPane) loader.load(); RootLayoutController controller = loader.<RootLayoutController>getController(); controller.setMainApp(this); Scene scene = new Scene(rootLayout); primaryStage.setScene(scene); primaryStage.show(); } catch (IOException e) { e.printStackTrace(); } } /** * Returns the main stage. * @return */ public Stage getPrimaryStage() { return primaryStage; } public static void main(String[] args) { launch(args); } }
Voici le code du contrôleur :
A l'initialisation du contrôleur, celui-ci charge les différents FXML et les affecte aux champs de type AnchorPane, qui sont "bindés" avec le FXML RootLayout.fxml
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 package org.speechmail.client.views; import java.io.IOException; import org.speechmail.client.MainApp; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.layout.AnchorPane; public class RootLayoutController { @FXML private AnchorPane folderList; @FXML private AnchorPane messageList; @FXML private AnchorPane messageViewer; private MainApp mainApp; public RootLayoutController() { } @FXML private void initialize() { FXMLLoader loader; try { loader = new FXMLLoader(MainApp.class.getResource("views/fxml/FolderList.fxml")); this.folderList = (AnchorPane) loader.load(); loader = new FXMLLoader(MainApp.class.getResource("views/fxml/FolderList.fxml")); this.messageList = (AnchorPane) loader.load(); loader = new FXMLLoader(MainApp.class.getResource("views/fxml/FolderList.fxml")); this.messageViewer = (AnchorPane) loader.load(); } catch (IOException e) { e.printStackTrace(); } } /** * Is called by the main application to give a reference back to itself. * * @param mainApp */ public void setMainApp(MainApp mainApp) { this.mainApp = mainApp; } }
Le problème, c'est que j'obtiens ma fenêtre principale, mais les sous-vues n'apparaissent pas.
J'ai vérifié et elles sont bien chargées par le FXMLLoader mais je ne comprends pas pourquoi elles ne s'affichent pas dans la fenêtre.
Je dois mal m'y prendre c'est sûr, mais en regardant la doc et les tutoriaux je ne trouve pas vraiment la solution.
Merci d'avance.
Partager