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)为您管理控制器(并将依赖注入它们),因为例如。