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