2014-08-27 50 views
2

我有一个递归的情况下需要在这里加载FXML。FXMLLoader获取控制器返回null

如果我选择查看目标,它会带我到另一个加载策略对象列表的屏幕实例。如果我选择查看策略,则会将我带到加载策略对象列表的另一个屏幕实例。如果我查看战术,它会带我到另一个加载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属性是否会再次映射。

回答

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); 
} 
+0

只是好奇,任何不直接在'fxml'中设置你的控制器的原因? – ItachiUchiha 2014-08-27 18:45:46

+0

我只有1个FXML文件和5个不同的控制器用于同一个FXML。如果我直接设置FXML,它将被连接到一个且只有一个控制器。我必须为每个深度级别动态地设置一个新的控制器。 – 2014-08-27 19:05:00