2014-08-27 5 views
2

여기에 필요한 재귀 적 FXML로드가 있습니다.FXMLLoader get controller returns null

목표보기를 선택하면 전략 개체 목록을로드하는 화면의 다른 인스턴스로 이동합니다. 전략을보기로 선택하면 Tactic 객체 목록을로드하는 화면의 다른 인스턴스로 이동합니다. Tactic을 본다면 Task 객체 목록을로드하는 화면의 다른 인스턴스로 이동합니다.

A picture of my UI

당연히, 나는 상속을 처리하기 위해 기본 컨트롤러 클래스, ViewChildItemController를 사용하기로 결정했다. 그런 다음 ViewObjective, ViewStrategy 및 ViewTactic에서 확장했습니다. Task는 하위 항목이없는 매우 낮은 수준의 항목이기 때문에 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

나는 하나의 FXML 파일과 동일한 FXML을위한 5 개 이상의 다른 컨트롤러를 가지고있다. FXML을 직접 설정하면 하나의 컨트롤러에만 연결됩니다. 모든 레벨의 깊이에 대해 새로운 컨트롤러를 동적으로 설정해야합니다. –