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();
}
}
在我的程序中,我有一个 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();
}
}