【问题标题】:JavaFX custom controller factoryJavaFX 自定义控制器工厂
【发布时间】:2013-10-03 08:47:31
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是哪个版本的 JavaFX?正如 oracle 引用的描述所说,它可能对 2.1 版有效,因为在那里覆盖的方法是 getController(Class&lt;?&gt; type),而在 2.2 中是 call(Class&lt;?&gt; 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


【解决方案1】:

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

【讨论】:

  • Uluk Biy 在 cmets 中发布的版本是 2.2 版还是 8 版?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2021-08-12
相关资源
最近更新 更多