Java替代@FXML注入控制器?

时间:2016-10-01 12:15:13

标签: java javafx fxml

所以我有一个来自主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)做到这一点?

1 个答案:

答案 0 :(得分:3)

您可以使用控制器工厂。如果在using System.Xml.Linq; 上设置控制器工厂,则在加载FXMLLoader包含的任何FXML文件时,将使用相同的控制器工厂。

所以:

<fx:include>

然后

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 ;
    }
};

FXML文件使用FXMLLoader loader = new FXMLLoader(); loader.setLocation(getClass().getResource(...)); loader.setControllerFactory(controllerFactory); Parent root = loader.load(); 以通常的方式声明控制器类。

控制器工厂可以非常强大:例如,您可以使用控制器工厂来允许依赖注入框架(例如Spring或Guice)为您管理控制器(并将依赖注入到它们中)。