2014-08-27 3 views
2

У меня есть рекурсивный случай загрузки FXML.FXMLLoader get controller возвращает null

Если я выбираю View Objective, он переносит меня в другой экземпляр экрана, который загружает список объектов Strategy. Если я выберу для просмотра Стратегии, он приведет меня к другому экземпляру экрана, который загружает список тактических объектов. Если я рассматриваю Tactic, он переносит меня в другой экземпляр экрана, который загружает список объектов Task.

A picture of my UI

Естественно, я решил использовать базовый класс контроллера, ViewChildItemController для обработки наследования. Затем я расширил его из ViewObjective, ViewStrategy и ViewTactic. (ViewTask не имеет смысла, потому что задача - это элемент самого низкого уровня без детей).

Проблема в том, что я использую 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

+0

У меня только 1 файл FXML и 5+ разных контроллеров для одного и того же FXML. Если я установлю FXML напрямую, он будет подключен к одному и только одному контроллеру. Я должен динамически устанавливать новый контроллер для каждого уровня глубины. –