在我的GUI應用程序中,我有兩個視圖:playlistView.fxml和videoView.fxml。每個都有自己的控制器。我想playListView是videoView佈局的一部分,所以我用:JavaFX8 FXML控制器注入
<fx:include fx:id="idPlayListAnchorPane" source="playListView.fxml" />
包含的文件。工作正常,播放列表顯示爲videoView佈局的一部分。
然後我注入idPlayListAnchorPane FXML可變進VideoViewController這樣的:
@FXML
private AnchorPane idPlayListAnchorPane;
工作過。例如,我可以在playListView從VideoViewController與禁用idPlayListAnchorPane:
idPlayListAnchorPane.setDisable(true);
爲了得到playListViewController我用:
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/designer/views/video/playListView.fxml"));
PlayListViewController playListViewController = new PlayListViewController();
loader.setController(playListViewController);
try {
AnchorPane playListView = (AnchorPane) loader.load();
} catch (IOException e) {
};
,然後我可以調用,例如:
playListViewController.init();
來自videoViewController。
但init()方法在playListView ListView中產生了一些測試值(試驗作爲單獨的應用程序和該作品)。但是,這些測試值現在不會顯示在ListView中。幾個小時後的簡單問題是:爲什麼不呢?從<fx:include>
一次,一次,當你在代碼中創建FXMLLoader
並調用load()
:
經過一番調查後,我發現ListView中的onAction處理程序不再觸發,所以顯然在listview控制器和videoViewController之間沒有「連接」。我認爲我最好的選擇是fx:include,但忘記了一個單獨的控制器並將代碼粘貼到第一個控制器中。 – Frank
不要這樣做。你仍然會有兩個控制器,他們只會來自同一個班級。除了仍然存在如何在兩個控制器實例之間進行通信的問題之外,要跟蹤每個實例中哪些字段已初始化將非常困難。 (其中一個將從一個FXML初始化,另一個來自另一個FXML)。只需使用[documentation](http://docs.oracle.com/javase/8/javafx/api/javafx/fxml)中顯示的標準機制/doc-files/introduction_to_fxml.html#nested_controllers) –