【发布时间】:2013-10-03 08:47:31
【问题描述】:
我一直在试验FXMLLoader 和使用自定义Callback<P,R> 实现的setControllerFactory 方法。
一个实现可能会返回一个空值来表明它确实如此 不能或不能创建给定类型的控制器;在这种情况下, 默认控制器构造机制将由 装载机。
我想要达到的结果是我可以使用依赖注入框架来创建任何需要参数的控制器,但我会让FXMLLoader 加载任何不需要参数的控制器。
如果我有以下简单的 FXML 文件,它使用不接受任何参数的 ViewController 类...
<StackPane fx:id="pane"
xmlns:fx="http://javafx.com/fxml"
fx:controller="my.package.ViewController">
</StackPane>
我使用以下简单的控制器工厂实现向FXMLLoader 发出信号,表明我希望它在这种情况下管理控制器的构造...
loader.setControllerFactory(new Callback<Class<?>, Object>(){
@Override
public Object Call(Class<?> type) {
return null; // Let the FXMLLoader handle construction...
}
});
在调用 load() 方法后,我在 ViewController 类中的 Initialise 方法永远不会被调用(我已经用断点验证了这一点)。
如果我将控制器工厂实现更改为返回 ViewController 类的实例,那么一切都会按预期工作。
谁能帮我解决我的困惑?是我使用了Callback接口不正确还是ORACLE文档不正确?
【问题讨论】:
-
您使用的是哪个版本的 JavaFX?正如 oracle 引用的描述所说,它可能对 2.1 版有效,因为在那里覆盖的方法是
getController(Class<?> type),而在 2.2 中是call(Class<?> param)。所以行为也可能会改变,请尝试使用 2.1 版本。 -
我使用的是 2.2 版。我注意到了回调语法的不同,但假设这就是所有的改变,因为在 2.2 文档中没有提到它。这不是一个主要问题,因为我可以使用依赖注入框架来创建在其构造函数中没有参数的控制器。
-
这里是FXMLLoader JavaFX 8 source code。虽然不是 2.2 但它们的大部分代码都是相似的。 controllerFactory 的唯一用法是
setController(controllerFactory.call(type));。所以它在 2.2 中可能是一样的。只是好奇您使用的是哪个 DI 框架? -
我正计划使用 Google Guice,但我还没有到那一步,因为我只是在评估
FXMLLoader和控制器工厂回调的行为。 -
如果为null,则不返回
null,而是返回type.newInstance();。
标签: javafx-2 fxml controller-factory