Javafx FXML 加载程序 getcontroller returns 空

Javafx FXML loader getcontroller returns null

在我的程序中,我有一个 tabPane,每个选项卡都有自己的 FXML 文件和控制器。我已经为选项卡 2(计划)加载了 FXML 文件。我正在尝试调用我的子控制器(调度程序)中的函数) 来自我的父控制器(FXML 文档)。当我使用 FXML Loader 加载控制器时,它 returns 为空。我该如何解决这个问题。

这是我的主要代码:

主要 FXML 文档:

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:id="AnchorPane" prefHeight="600" prefWidth="800" xmlns="http://javafx.com/javafx/8.0.65"   fx:controller="showprojavafxml.FXMLDocumentController">
    <children>

FXMLLoader 仅在加载 fxml 文件时实例化控制器(必须如此,因为控制器 class 在 fxml 文件中指定...)。由于您从不在加载程序上调用 load(),因此永远不会创建控制器。

您似乎通过两种不同的机制引用了 FXML 文件两次:一次是在 FXMLDocumentController.initialize() 中,您创建了一个 FXMLLoader,其位置设置为 fxml 文件,一次是在主 FXML 文档本身,通过 <fx:include><fx:include> 导致显示 Scheduler.fxml 中定义的 UI;您在 initialize() 方法中创建的 FXMLLoader 不是(因为您从未调用 load() 并显示结果)。

要为包含的 fxml 引用控制器,请使用 "Nested controller" technique

首先,将 fx:id 添加到您的 fx:include:

<Tab fx:id="tab2" text="Scheduler"   >
    <fx:include fx:id="scheduler" source="Scheduler.fxml" />
</Tab>

现在您可以将控制器注入到名称为 fx:id 并附加文本 "Controller" 的字段中:

public class FXMLDocumentController {

    @FXML
    private SchedulerController schedulerController ;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        schedulerController.refreshList();
    }

}