JAVAFX: передача данных между FXML не работает

Я несколько раз искал здесь ответ, но не нашел своего решения.

В моем случае: я хочу получить данные от пользователя и проверить достоверность. Если все в порядке, я возьму ID пользователей из базы данных и отправлю этот ID в другой FXML, а затем запущу там запрос на выборку, используя этот ID и отображать результаты в tableView.

Во втором FXML (контроллере) я использую метод initialize() для установки данных в tableView и метод setId() для получения ID пользователя из предыдущего FXML. Но метод initialize() вызывается перед методом setId() и не предоставляет требуемый результат, поскольку идентификатор равен нулю.

Используется Передача параметров JavaFX FXML, этот метод формирует передачу данных между FXML.

Что будет лучшим решением для этого?

К вашему сведению: в настоящее время я использую дополнительный класс со статической переменной для хранения идентификатора.


person Shihab    schedule 06.01.2016    source источник
comment
Вы можете установить данные tableview на setId().   -  person Uluk Biy    schedule 06.01.2016
comment
Спасибо за ваши советы. Это работает: Д   -  person Shihab    schedule 06.01.2016


Ответы (1)


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

FXMLLoader loader = new FXMLLoader(url);
loader.setControllerFactory(c -> {
    MyController controller = new MyController();
    controller.setId(userId);
    return controller;
});
...
Node n = loader.load();

Таким образом, вы также можете использовать классы в качестве контроллеров, которые не предоставляют конструктор по умолчанию. Для соединения модели и презентатора можно использовать более сложную фабрику контроллеров (см. MVP).

Альтернативой может быть изменение содержимого сцены в методе setId вместо метода initialize, что было бы проще, чем использование фабрики контроллеров.

Лучшее решение зависит от ваших потребностей и личных предпочтений. Однако по возможности следует избегать использования члена static для передачи данных.

person Community    schedule 06.01.2016
comment
В этом случае используйте setController вместо setControllerFactory. Если вы действительно хотите использовать setControllerFactory, вам нужно быть гораздо более осторожным, так как вы сломаете <fx:include> (довольно ужасным образом) с этим (включенные файлы FXML используют одну и ту же фабрику контроллеров для создания своих экземпляров контроллера). - person James_D; 06.01.2016