Фабрика пользовательских контроллеров 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 неверен.