Фабрика пользовательских контроллеров JavaFX

я экспериментировал с FXMLLoader и с помощью setControllerFactory метод с использованием пользовательского Callback<P,R> реализация.

документация ORACLE говорит следующее:

реализация может возвращать значение null, чтобы указать, что она делает нельзя создать контроллер данного типа; в этом случае механизм конструкции регулятора по умолчанию будет использован погрузчик.

в результат, которого я хочу достичь, заключается в том, что я могу использовать структуру инъекции зависимостей для создания любых контроллеров, требующих параметров, но я позволю 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 класс никогда не вызывается (я проверил это с помощью точки останова).

если я изменю свою реализацию фабрики контроллера, чтобы вернуть экземпляр ViewController класс тогда все работает так, как ожидалось.

может ли кто-нибудь помочь мне прояснить мое замешательство? Я использую Callback интерфейс неправильно или является документацией ORACLE ошибочные?

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 неверен.