2

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

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

我的 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 属性。

4

1 回答 1

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);
}
于 2014-08-27T18:35:43.477 回答