Сценарий
Я создаю графический интерфейс, в котором несколько представлений ссылаются на один и тот же объект модели.
Что я привык к
В Swing, если я хочу, чтобы все представления ссылались на одну и ту же модель, я передал бы модель в конструктор.
Что я сейчас делаю
В JavaFX я прохожу модель вокруг, имея метод setter в представлениях/контроллерах (menubars, split panes, tabs,...) после загрузки каждого представления/контроллера. Я нахожу это очень липким и громоздким. Кроме того, я считаю, что это не сработает, потому что в некоторых ситуациях мне нужна модель, которая уже существует в контроллере, прежде чем инициализируются некоторые из виджетов контроллера.
Альтернативы Lackluster
(Примечание. Я ссылаюсь на эти вопросы с помощью stackoverflow:
- Javafx 2.0 How-Application Application.getParameters() в файле Controller.java
- Передача параметров JavaFX FXML
- Несколько FXML с контроллерами, общий объект
-
Инъекция зависимостей
- Я просмотрел этот веб-сайт, http://www.zenjava.com/2011/10/23/javafx-2-0-fxml-and-spring/, и я немного посмотрел в google Guice, но я не см. способ упрощения предоставления каждому представлению/контроллеру JavaFX одного и того же объекта модели. Казалось, что инъекция вводит другую модель для каждого вида/контроллера.
-
Сохранение объекта модели как общедоступной статической переменной
- Это вариант, но на данный момент мне не нравится идея открытой открытой публичной модели. Очевидно, я могу сделать его частной статической переменной и иметь геттеры и сеттеры, но мне тоже не нравится эта идея.
-
Передача параметров от вызывающего абонента к контроллеру
-
Я хочу, чтобы каждый контроллер загружал себя в свой конструктор, и я хочу, чтобы каждый пользовательский контроллер автоматически вводился в его родительский контроллер. Например, вкладка обзора карты загружается следующим образом:
public CardOverviewTab() { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("card_overview_tab.fxml")); fxmlLoader.setRoot(content); fxmlLoader.setController(this); try { fxmlLoader.load(); } catch (Exception e) { e.printStackTrace(); } }
-
И контроллер SingleGameSetup имеет вкладку обзора карты, автоматически вводимую в переменную:
public class SingleGameSetupController extends AnchorPane { @FXML private CardOverviewTab cardOverviewTab; // Rest of the class }
-
И часть fxml, содержащая вкладку обзора карты, выглядит следующим образом:
<CardOverviewTab fx:id="cardOverviewTab" />
-
Таким образом, мне не нужно беспокоиться о ручной загрузке контроллера, но у меня все еще есть проблема с настройкой модели.
-
-
Настройка контроллера на FXMLLoader
- Этот параметр похож на то, к чему я привык, передавая модель в качестве параметра в конструктор, но по-прежнему возникает проблема загрузки контроллеров вручную с помощью FXMLLoader.
-
Шина событий
- Я не слишком много читал в этом, но из того, что я прочитал, автобус событий кажется неактивным и устаревшим.
-
Singleton
- Это похоже на публичную статическую ссылку на объект модели, которую могут получить контроллеры, но опять же я ищу лучшее решение. Кроме того, я не хочу синглтонную модель.
Что я ищу
Есть ли способ передать объект модели вокруг менее громоздким способом? Я ищу способ, который так же прост, как передать модель конструктору, но я не хочу иметь дело с ручными контроллерами загрузки через FXMLLoader или устанавливать модель после загрузки контроллеров. Может быть, иметь класс для извлечения модели - лучший вариант, но я прошу на всякий случай, если есть лучший способ.