Java FXMLLoader获取控制器返回null

Java FXMLLoader获取控制器返回null,java,javafx,javafx-8,fxml,fxmlloader,Java,Javafx,Javafx 8,Fxml,Fxmlloader,我这里需要一个FXML加载的递归案例 如果我选择查看一个目标,它会将我带到另一个加载策略对象列表的屏幕实例。如果我选择查看策略,它会将我带到屏幕的另一个实例,该实例加载战术对象列表。如果我查看一个策略,它会将我带到屏幕的另一个实例,该实例加载任务对象列表 当然,我决定使用一个基本的控制器类ViewChildItemController来处理继承。然后我从它扩展了ViewObjective、ViewStrategy和ViewTactic。(ViewTask毫无意义,因为任务是没有子项的最低级别的

我这里需要一个FXML加载的递归案例

如果我选择查看一个目标,它会将我带到另一个加载策略对象列表的屏幕实例。如果我选择查看策略,它会将我带到屏幕的另一个实例,该实例加载战术对象列表。如果我查看一个策略,它会将我带到屏幕的另一个实例,该实例加载任务对象列表

当然,我决定使用一个基本的控制器类ViewChildItemController来处理继承。然后我从它扩展了ViewObjective、ViewStrategy和ViewTactic。(ViewTask毫无意义,因为任务是没有子项的最低级别的项目)

问题是,当我使用loader.loadController()时,该方法返回null

FXMLLoader loader = new FXMLLoader(this.getClass()
        .getResource(ScreenPaths.VIEW_PLAN_ITEM));
Parent root = null;
try {
    root = loader.load();
} catch (IOException e) {
}
ViewObjectiveController ctrl = loader.getController();//Return null? Why?
ObservableList<Strategy> childItems = childItemsTableView.
        getSelectionModel().getSelectedItem().getChildPlanItems();
ctrl.initValues(childItems);
DialogPopup.showNode(root);
FXMLLoader=newfxmlloader(this.getClass())
.getResource(ScreenPaths.VIEW_PLAN_ITEM));
父根=空;
试一试{
root=loader.load();
}捕获(IOE异常){
}
ViewObjectiveController ctrl=loader.getController()//返回空值?为什么?
ObservableList childItems=childItemsTableView。
getSelectionModel().getSelectedItem().getChildPlanItems();
ctrl.initValues(childItems);
DialogPopup.showNode(根);
是否加载的基本FXML连接到ViewChildItemController?我是否必须创建几个FXML副本,并将控制器分别挂接到每个ViewObjectiveController、ViewStrategyController等?这样做没有多大意义


我可以尝试loader.setController(),但我不确定@FXML属性是否会再次映射。

结果表明,我所要做的就是将控制器视为“动态的”

也就是说,在加载根目录之前设置控制器

@Override
protected void viewChildItem() {
    FXMLLoader loader = new FXMLLoader(this.getClass()
            .getResource(ScreenPaths.VIEW_PLAN_ITEM));
    ViewTacticController ctrl = new ViewTacticController();
    loader.setController(ctrl);
    Parent root = null;
    try {
        root = loader.load();
    } catch (IOException e) {
    }
    ObservableList<Task> childItems = childItemsTableView.
            getSelectionModel().getSelectedItem().getChildPlanItems();
    ctrl.initValues(childItems);
    DialogPopup.showNode(root);
}
@覆盖
受保护的无效viewChildItem(){
FXMLLoader=新的FXMLLoader(this.getClass()
.getResource(ScreenPaths.VIEW_PLAN_ITEM));
ViewTacticController ctrl=新建ViewTacticController();
加载程序。设置控制器(ctrl);
父根=空;
试一试{
root=loader.load();
}捕获(IOE异常){
}
ObservableList childItems=childItemsTableView。
getSelectionModel().getSelectedItem().getChildPlanItems();
ctrl.initValues(childItems);
DialogPopup.showNode(根);
}

我只是好奇,为什么不直接在
fxml
中设置控制器?我只有1个fxml文件,同一个fxml有5个以上不同的控制器。如果我直接设置FXML,它将连接到一个且只有一个控制器。我必须为每个深度级别动态设置一个新控制器。