gpt4 book ai didi

Java 替代 @FXML 注入(inject) Controller ?

转载 作者:行者123 更新时间:2023-11-29 04:39:31 25 4
gpt4 key购买 nike

所以我有一个来自主 fxml 文件的主 Controller 和来自包含文件的另外两个 Controller 。现在我通过 @FXML ChildController childController 注入(inject)子 Controller 。现在它可以工作了,以前使用 FXML 的每个人都知道我在说什么。带注释的依赖注入(inject)都很好,但我想自己做,因为我有自己的计划来处理所有 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) 做到这一点呢?

最佳答案

您可以使用 Controller 工厂。如果您在 FXMLLoader 上设置 Controller 工厂,当 <fx:include> 包含任何 FXML 文件时,将使用相同的 Controller 工厂已加载。

所以:

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 文件只是以通常的方式声明 Controller 类,使用 fx:controller="..." .

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

关于Java 替代 @FXML 注入(inject) Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39806497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com