JavaFX8 FXML控制器注入

Fra*_*ank 2 controller fxml javafx-8

在我的GUI应用程序中,我有两个视图:playlistView.fxmlvideoView.fxml.每个人都有自己的控制器.我希望playListView成为videoView布局的一部分,所以我使用:

<fx:include fx:id="idPlayListAnchorPane" source="playListView.fxml" />
Run Code Online (Sandbox Code Playgroud)

包含文件.工作正常,播放列表显示为videoView布局的一部分.

然后我将idPlayListAnchorPane FXML变量注入VideoViewController,如下所示:

@FXML
private AnchorPane idPlayListAnchorPane;    
Run Code Online (Sandbox Code Playgroud)

也工作.例如,我可以禁用idPlayListAnchorPaneplayListViewVideoViewController有:

idPlayListAnchorPane.setDisable(true);
Run Code Online (Sandbox Code Playgroud)

要获取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) {
    };
Run Code Online (Sandbox Code Playgroud)

然后我可以打电话给例如:

playListViewController.init();    
Run Code Online (Sandbox Code Playgroud)

来自videoViewController.

但init()方法在playListView ListView中创建了一些测试值(作为一个单独的应用程序进行测试,并且可以正常工作).但是,这些测试值现在不会显示在ListView中.几个小时后的简单问题是:为什么不呢?

Jam*_*s_D 5

您正在加载playListView.fxml文件两次:从<fx:include>创建内置FXMLLoader代码并调用一次和一次load().AnchorPane<fx:include>GUI 创建的节点层次结构(即其及其所有内容)显示在GUI中; FXMLLoader.load()呼叫创建的那个不是.

由于您创建的控制器与未显示的节点层次结构相关联,因此您在控制器上调用的方法将不会对您的UI产生任何影响.

FXMLLoader您可以VideoViewController使用文档中描述的嵌套控制器技术将包含FXML的控制器直接注入到您的控制器实例中,而不是创建一个获取控制器实例.

为此,首先fx:controllerplayListView.fxml根元素添加一个属性:

playListView.fxml:

<!-- imports etc -->
<AnchorPane fx:controller="com.mycompany.packagename.PlayListViewController">
    <!-- etc etc -->
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)

由于您已经fx:id="idPlayListAnchorPane"定义了一个属性<fx:include ...>,因此可以VideoViewController使用一个被@FXML注释的字段将控制器直接注入到类中idPlayListAnchorPaneController(规则是将"Controller"附加到id):

public class VideoViewController {
    @FXML
    private AnchorPane idPlayListAnchorPane;
    @FXML
    private PlayListViewController idPlayListAnchorPaneController ;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

现在您可以根据需要调用控制器上的方法.