2014-08-27 116 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