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 ответа

Решение

Проблема может быть решена, если вы выполняете следующие условия:

  1. Не только публичный, но и обязательный статический MainController mc должно быть.

  2. Не забудьте идентификатор в fxml для CustomComponentController: <CustomComponentController fx:id="cc"/>где cc - это имя "@FXML импортированных" CustomComponentController в вашем классе MainController.

  3. Пропустить параметр fx:controller="main.CustomComponentController" в custom_component_controller.fxml как это приводит к ошибке "Значение контроллера уже указано" (конфликт между main.fxml а также custom_component_controller.fxml разметка заявленных контроллеров).

  4. Положил mc = this; в начале MainController"s initialize() метод. Перед использованием mc в классе CustomComponentController проверьте, не является ли он нулевым. Может быть нулевым, когда все компоненты, включая CustomComponentController, создаются при запуске приложения, но еще нет экземпляра mc. Метод MainController initialize() где создается MainController, вызывается после загрузки компонентов. Поэтому лучшей практикой является использование подхода в следующем абзаце.

  5. В main.fxml создать основной компонент того же типа, что CustomComponentController и с единственным fx:id параметр. Замените основной компонент на ваш CustomComponentController создавая reloadCustomComponents() метод и вызов его из CustomComponentController"s initialize() метод. Сделайте это, добавив следующее в reloadCustomComponents() метод:

    . CustomComponentAnchorPane.getChildren() удалить (customComponent);

    customComponent = new customComponent ();

    customComponentAnchorPane.getChildren() добавить (customComponent).

Таким образом, все компоненты могут быть размещены снаружи CustomComponentController со всеми их методами и перезагружается при запуске приложения. Все объявления компонентов остаются в MainController класс и может быть достигнуто через MainController mc ссылка. Не требуется дублировать создание компонентов в деталях с параметрами.

Ваша проблема выглядит как классическое обновление форм каталога, я реализовал интерфейс, который я назвал Updatable с update method чтобы после прохождения я мог легко ссылаться на любую форму каталога Controller Main Class как UserData Property формы дочернего корневого компонента

Надеюсь, что это может решить вашу проблему

Другие вопросы по тегам