javafx-2 – JavaFX自定义控制器工厂

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

The ORACLE documentation说以下内容:

An implementation might return a null value to indicate that it does
not or cannot create a controller of the given type; in this case, the
default controller construction mechanism will be employed by the
loader.

我想要实现的结果是我可以使用依赖注入框架来创建任何需要参数的控制器,但我会让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在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教程是不正确的.

转载注明原文:javafx-2 – JavaFX自定义控制器工厂 - 代码日志