JavaFX自定义控制器工厂

Ben*_*ale 9 controller-factory javafx-2 fxml

我一直在尝试使用自定义实现FXMLLoadersetControllerFactory方法Callback<P,R>.

ORACLE文档说明如下:

实现可能返回null值以指示它不能或不能创建给定类型的控制器; 在这种情况下,加载器将使用默认控制器构造机制.

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

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

<StackPane fx:id="pane"
          xmlns:fx="http://javafx.com/fxml"
          fx:controller="my.package.ViewController">
</StackPane>
Run Code Online (Sandbox Code Playgroud)

并且我使用以下简单的控制器工厂实现来发信号通知FXMLLoader我希望它在这种情况下管理控制器的构造...

loader.setControllerFactory(new Callback<Class<?>, Object>(){
    @Override
    public Object Call(Class<?> type) {
        return null; // Let the FXMLLoader handle construction...
    }
});
Run Code Online (Sandbox Code Playgroud)

在调用load()方法之后,我的ViewController类中的Initialise方法永远不会被调用(我已用断点验证了这一点).

如果我更改我的控制器工厂实现以返回ViewController该类的实例,那么一切都按预期工作.

任何人都可以帮我解决我的困惑吗?我是否Callback错误地使用了界面或者ORACLE文档不正确?

Seb*_*ian 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);
    }
Run Code Online (Sandbox Code Playgroud)

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