Javafx FXML加载器getcontroller返回null

时间:2016-03-30 23:46:38

标签: javafx fxml

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

这是我的主要代码:

主要FXMLDocument:

<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>

1 个答案:

答案 0 :(得分:0)

FXMLLoader仅在加载fxml文件时实例化控制器(必须是这种情况,因为控制器类是在fxml文件中指定的......)。由于您从不在加载器上调用load(),因此永远不会创建控制器。

看起来你通过两种不同的机制引用FXML文件两次:一次在FXMLDocumentController.initialize()中,你创建一个FXMLLoader,其位置设置为fxml文件,一次在主FXML中通过<fx:include>记录自己。 <fx:include>导致显示Scheduler.fxml中定义的用户界面;您在FXMLLoader方法中创建的initialize()不是(因为您从不致电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();
    }

}