簡體   English   中英

Java替代@FXML注入控制器?

[英]Java alternative to @FXML injection of controllers?

所以我有一個來自主fxml文件的主控制器和來自包含文件的另外兩個控制器。 現在我通過@FXML ChildController childController注入子控制器。 現在它起作用了,之前使用FXML的每個人都知道我在說什么。 帶注釋的依賴注入很好但我想自己做這個,因為我有自己的處理所有DI的計划。

(下面的問題)

這就是我發起整個事情的方式:

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)做到這一點?

您可以使用控制器工廠。 如果在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)為您管理控制器(並將依賴關系注入到它們中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM