2016-10-01 2 views
1

그래서 주 fxml 파일의 마스터 컨트롤러와 포함 파일의 다른 두 컨트롤러가 있습니다. 이제 @FXML ChildController childController을 통해 자식 컨트롤러를 주입합니다. 이제는 작동하고, 전에 FXML을 사용 해본 모든 사람들은 내가 무슨 말을하고 있는지 알고 있습니다. 주석을 사용한 종속성 삽입은 모두 괜찮지 만 모든 DI를 처리하는 자체 계획이 있으므로이 작업을 직접 수행하려고합니다.컨트롤러의 @FXML 주입 대신 자바를 사용 하시겠습니까?

(아래 질문)

이 내가 모든 게 시작하는 방법입니다

public void start(Stage primaryStage) throws Exception {  
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("Some resource")); 

    MainController mainController = new Controller(); 
    loader.setController(mainController); 

    Scene scene = new Scene(loader.load(), w, h); 

    primaryStage.setScene(scene); 

    primaryStage.show(); 
} 

는 기본적으로 나는이 작업을 수행 할을 :

SubController1 A = new SubController1(); 
SubController2 B = new SubController2(); 
MainController C = new MainControllerC(A, B); 

그래서 FXML이 할 수있는 방법 (JavaFX)?

답변

2

컨트롤러 팩터 리를 사용할 수 있습니다. 컨트롤러 팩토리를 FXMLLoader에 설정하면 <fx:include>에 포함 된 FXML 파일이로드 될 때 동일한 컨트롤러 팩토리가 사용됩니다.

그래서 :

Callback<Class<?>, Object> controllerFactory = new Callback<Class<?>, Object>() { 

    SubController1 a = new SubController1(); 
    SubController2 b = new SubController2(); 
    MainController c = new MainController(a, b); 

    @Override 
    public Object call(Class<?> type) { 
     if (type == SubController1.class) { 
      return a ; 
     } 
     if (type == SubController2.class) { 
      return b ; 
     } 
     if (type == MainController.class) { 
      return c ; 
     } 
     return null ; 
    } 
}; 

그리고

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource(...)); 
loader.setControllerFactory(controllerFactory); 
Parent root = loader.load(); 

FXML 파일 그냥 fx:controller="..."을 사용하여 일반적인 방법으로 컨트롤러 클래스를 선언합니다.

컨트롤러 팩토리는 매우 강력 할 수 있습니다. 컨트롤러 팩토리를 사용하여 종속성 주입 프레임 워크 (예 : Spring 또는 Guice)에서 컨트롤러를 관리하고 종속성을 주입 할 수 있습니다.

+0

마침내 Omg! 그거 재미 있네. 몇 년 동안의 경험이 있습니까? :) – Asperger

+0

정말 stackoverflow에 대한 모든 훌륭한 기여에 감사드립니다. 나는 많은 당신의 게시물을 따라 갔다. 너는 위대하다! – Asperger

관련 문제