10

我一直在尝试使用自定义实现FXMLLoader的方法。setControllerFactoryCallback<P,R>

ORACLE 文档说明如下:

一个实现可能会返回一个空值来表明它没有或不能创建给定类型的控制器;在这种情况下,加载程序将使用默认的控制器构造机制。

我想要实现的结果是我可以使用依赖注入框架来创建任何需要参数的控制器,但我会让FXMLLoader加载任何不需要参数的控制器。

因此,如果我有以下使用ViewController不接受参数的类的简单 FXML 文件...

<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 文档不正确?

4

1 回答 1

16

javafx 在 FXMLLoader 中执行以下操作:

    try {
      if (controllerFactory == null) {
        setController(ReflectUtil.newInstance(type));
      } else {
        setController(controllerFactory.call(type));
      }
    } catch (InstantiationException exception) {
      throw new LoadException(exception);
    } catch (IllegalAccessException exception) {
      throw new LoadException(exception);
    }

所以,是的,oracle 教程是不正确的。

于 2013-10-07T08:48:29.790 回答