![](/img/trans.png)
[英]How to wire multiple fxml controllers using spring dependency-injection?
[英]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.