FXMLLoader get控制器返回null

时间:2014-08-27 18:25:54

标签: java javafx javafx-8 fxml fxmlloader

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

如果我选择查看目标,则会转到另一个加载策略对象列表的屏幕实例。如果我选择查看策略,它会将我带到另一个加载Tactic对象列表的屏幕实例。如果我查看Tactic,它会将我带到另一个加载Task对象列表的屏幕实例。

A picture of my UI

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

问题是,当我使用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);

是否可以将正在加载的基础FXML挂钩到ViewChildItemController?我是否必须创建FXML的多个副本并将控制器分别挂钩到每个ViewObjectiveController,ViewStrategyController等?这样做没有多大意义。

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

1 个答案:

答案 0 :(得分:2)

事实证明我所要做的就是将控制器视为“动态”。

即,在加载根之前设置控制器。

@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);
}