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)为您管理控制器(并将依赖注入它们),因为例如。
所以我有一个来自主 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)为您管理控制器(并将依赖注入它们),因为例如。