JavaFx: как ссылаться на основной экземпляр класса Controller из класса CustomComponentController?
То, что у меня есть стандартное приложение JavaFX: Main.java, MainController.java & main.fxml
, Чтобы добавить пользовательский компонент, я создал CustomComponentController.java
а также custom_component_controller.fxml
,
ПРОБЛЕМА в том, что в CustomComponentController
методы мне нужно ссылаться на другие методы и стандартные компоненты из MenuController
, я добавить public static MainController mc;
в MainController
тело класса, так что это видно из CustomComponentController
(MainController.mc.neededMethod()
). Тогда я пытаюсь передать все это в MainController.initialize()
метод (mc = this;
) - при отладке этой точки останова вижу this
полно экземпляров компонентов, но mc
остается с нулевыми компонентами впоследствии.
ВОПРОС - как ссылаться на работающий экземпляр MainController
использовать его компоненты и методы в других классах и создавать перекрестные ссылки между различными пользовательскими компонентами? Как убрать MainController
код из обработчиков событий и вспомогательных методов компонентов, перемещая все это в собственный класс компонента?
Я попробовал следующие подходы, но не нашел способа заставить их работать без ошибок:
Доступ к классу контроллера FXML
Как я могу получить доступ к классу Controller в JavaFx 2.0?
JavaFX 2.0 + FXML. Обновление значений сцены из другой Задачи
JavaFX 2.2 -fx:include - как получить доступ к родительскому контроллеру с дочернего контроллера
2 ответа
Проблема может быть решена, если вы выполняете следующие условия:
Не только публичный, но и обязательный статический
MainController mc
должно быть.Не забудьте идентификатор в fxml для CustomComponentController:
<CustomComponentController fx:id="cc"/>
где cc - это имя "@FXML импортированных" CustomComponentController в вашем классе MainController.Пропустить параметр
fx:controller="main.CustomComponentController"
вcustom_component_controller.fxml
как это приводит к ошибке "Значение контроллера уже указано" (конфликт междуmain.fxml
а такжеcustom_component_controller.fxml
разметка заявленных контроллеров).Положил
mc = this;
в началеMainController
"sinitialize()
метод. Перед использованиемmc
в классе CustomComponentController проверьте, не является ли он нулевым. Может быть нулевым, когда все компоненты, включаяCustomComponentController
, создаются при запуске приложения, но еще нет экземпляра mc. Метод MainControllerinitialize()
где создается MainController, вызывается после загрузки компонентов. Поэтому лучшей практикой является использование подхода в следующем абзаце.В
main.fxml
создать основной компонент того же типа, чтоCustomComponentController
и с единственнымfx:id
параметр. Замените основной компонент на вашCustomComponentController
создаваяreloadCustomComponents()
метод и вызов его изCustomComponentController
"sinitialize()
метод. Сделайте это, добавив следующее вreloadCustomComponents()
метод:. CustomComponentAnchorPane.getChildren() удалить (customComponent);
customComponent = new customComponent ();
customComponentAnchorPane.getChildren() добавить (customComponent).
Таким образом, все компоненты могут быть размещены снаружи CustomComponentController
со всеми их методами и перезагружается при запуске приложения. Все объявления компонентов остаются в MainController
класс и может быть достигнуто через MainController mc
ссылка. Не требуется дублировать создание компонентов в деталях с параметрами.
Ваша проблема выглядит как классическое обновление форм каталога, я реализовал интерфейс, который я назвал Updatable
с update method
чтобы после прохождения я мог легко ссылаться на любую форму каталога Controller Main Class
как UserData Property
формы дочернего корневого компонента
Надеюсь, что это может решить вашу проблему