2016-10-01 64 views
1

所以我有一個主控制器從主要的fxml文件和兩個其他控制器從包含文件。現在我通過@FXML ChildController childController注入子控制器。現在它可以正常工作,每個使用FXML的人都知道我在說什麼。帶註釋的依賴注入很好,但我想自己做,因爲我有自己的計劃來處理所有的DI。Java替代@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