JavaFX自定义控制器工厂

时间:2013-10-03 08:47:32

标签: javafx-2 fxml controller-factory

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

The ORACLE documentation说以下内容:

  

实现可能会返回一个空值来指示它   不能或不能创建给定类型的控制器;在这种情况下,   默认控制器构造机制将被采用   加载器。

我想要实现的结果是我可以使用依赖注入框架来创建任何需要参数的控制器,但我会让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文档是否错误?

1 个答案:

答案 0 :(得分:15)

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教程不正确。