【发布时间】:2018-08-13 12:19:49
【问题描述】:
我想在控制器的 initialize 方法在创建时自动调用之前在控制器中设置一些非 UI 字段。据我了解,这样做的方法是提供自定义ControllerFactory,因为initialize() 被调用之后 ControllerFactory 返回创建的对象。我想按照this 回答使用以下代码:
FXMLLoader loader = new FXMLLoader(mainFXML); // some .fxml file to load
loader.setControllerFactory(param -> {
Object controller = null;
try {
controller = ReflectUtil.newInstance(param); // this is default behaviour
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
if (controller instanceof Swappable) {
((Swappable) controller).setSwapper(swapper); // this is what I want to add
}
return controller;
});
但是,ReflectUtil 类(默认使用 setControllerFactorymethod)是 com.sun.reflect.misc 包的一部分,我无法使用它,因为使用 error: package sun.reflect.misc does not exist 编译失败。
据我了解,我不能使用 sun 包,因为这不是公共 API。所以问题是:我该怎么办?我找不到任何其他示例,只有具有 ReflectUtil 的示例,而且,我希望我的 ControllerFactory 符合带有 @FXML 注释的 JavaFX 的默认工作流程等等,这对于其他一些 DI 框架是否可行,例如例如,乔德娇小的?还有其他方法可以设置字段吗? (除了同步它并在initialize() 中等待,直到从其他线程调用setter 方法)。
Full code github 上的上下文。
【问题讨论】:
-
Object controller = param.getConstructor().newInstance()。这使用Class.getConstructor(Class...)和Constructor.newInstance(Object...)。 -
@Slaw 这行得通,谢谢。如果您将其发布为答案,我会接受它
-
您真正想要注入哪些对象以及谁来创建它们?在 fxml 中,有一些机制可以创建和注入可能对您有用的对象。
-
示例中的 @mrmcwolf Swapper 是一个抽象类,有两个重写方法(基本上是监听器),控制器将共享这些方法,并使用这些方法让主控制器知道需要切换场景。我正在为自己制作类似 DataFX 的东西,但反射较少,在后台线程中添加了缓存和加载 FXML。
-
所以用户创建了一个 Swapper 实例并希望将其注入到控制器中?
标签: java javafx reflection fxml fxmlloader