我需要一个FXML加载的递归案例。
如果我选择查看目标,则会转到另一个加载策略对象列表的屏幕实例。如果我选择查看策略,它会将我带到另一个加载Tactic对象列表的屏幕实例。如果我查看Tactic,它会将我带到另一个加载Task对象列表的屏幕实例。
当然,我决定使用基本控制器类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属性。
答案 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);
}