Java FXMLLoader获取控制器返回null
我这里需要一个FXML加载的递归案例 如果我选择查看一个目标,它会将我带到另一个加载策略对象列表的屏幕实例。如果我选择查看策略,它会将我带到屏幕的另一个实例,该实例加载战术对象列表。如果我查看一个策略,它会将我带到屏幕的另一个实例,该实例加载任务对象列表 当然,我决定使用一个基本的控制器类ViewChildItemController来处理继承。然后我从它扩展了ViewObjective、ViewStrategy和ViewTactic。(ViewTask毫无意义,因为任务是没有子项的最低级别的项目) 问题是,当我使用loader.loadController()时,该方法返回nullJava FXMLLoader获取控制器返回null,java,javafx,javafx-8,fxml,fxmlloader,Java,Javafx,Javafx 8,Fxml,Fxmlloader,我这里需要一个FXML加载的递归案例 如果我选择查看一个目标,它会将我带到另一个加载策略对象列表的屏幕实例。如果我选择查看策略,它会将我带到屏幕的另一个实例,该实例加载战术对象列表。如果我查看一个策略,它会将我带到屏幕的另一个实例,该实例加载任务对象列表 当然,我决定使用一个基本的控制器类ViewChildItemController来处理继承。然后我从它扩展了ViewObjective、ViewStrategy和ViewTactic。(ViewTask毫无意义,因为任务是没有子项的最低级别的
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,它将连接到一个且只有一个控制器。我必须为每个深度级别动态设置一个新控制器。