2016-10-01 2 views
1

私はメインのfxmlファイルのマスタコントローラとインクルードファイルの2つのコントローラを持っています。今私は子供のコントローラを@FXML ChildController childController経由で注入します。今は動作し、以前はFXMLで働いていたすべての人が、私の話すことを知っています。アノテーションによる依存関係注入はすべて問題ありませんが、私はすべてのDIを処理する独自の計画があるため、これを自分で実行したいと思います。コントローラーの@FXML注入の代わりのJava?

(以下問)

は、これは私が全体の事を開始する方法です:

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

関連する問題