所以我有一个来自主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)做到这一点?
答案 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)为您管理控制器(并将依赖注入到它们中)。