У меня есть стандартное приложение JavaFX, которое расширяет Application. Первая страница, которую я показываю, — это панель инструментов с кнопками для открытия других приложений. Это все в порядке, первое приложение — это страница администратора под названием AdminController, которая позволяет пользователю выполнять операции CRUD над объектами модели — пользователем, контактами, продуктами, каждая сущность — это вкладка в представлении администратора — так что в моем основном Admin FXML (используя SceneBuilder ) Я включаю другие страницы fxml, используя fx:include вкладку пользователей, вкладку контактов и вкладку продуктов. Опять же, все эти включения находятся в файле Admin.fxml с собственным контроллером.
<Tab fx:id="contactsTab" onSelectionChanged="#goToContacts" text="Contact">
<content>
<fx:include source="/fxml/manager_contacts_tab.fxml" fx:id="contact" />
</content
<Tab/>
Моя идея заключалась в том, чтобы загрузить ресурсы, которые потребуются каждой странице, пользователей/контакты/продукты в AdminController, чтобы каждый fx:include, который я использовал, мог использовать те же самые объекты. Поскольку некоторым вкладкам нужны все эти ресурсы, например пользователям, для управления ассоциациями, а другим вкладкам, таким как продукт, нужен только список продуктов. Мой основной контроллер выглядит так.
public class AdminController {
@FXML
UserController userController;
@FXML
ProductController productController;
@FXML
ContactController contactController;
@FXML
public void initialize
// at this point userController already ran, and called DB so it calls it again here
if (users == null) {
this.users = FXCollections.observableArrayList(userDao.getAllWithProductsAndContacts());
}
if (products == null) {
this.products = FXCollections.observableArrayList(productDao.getAll());
}
if (contacts == null) {
this.contacts = FXCollections.observableArrayList(contactDao.getAll());
}
contactController.setContacts(contact);
// set other resources, like products
}
Логически в моей голове я бы подумал, что метод инициализации для AdminController будет запущен первым, что позволит мне установить любые объекты, которые мне нужны, в дочерних контроллерах, поскольку я могу получить к ним доступ, но происходит то, что дочерние контроллеры запускаются первыми, например . с контактконтроллером
public class ContactController {
@FXML
public void initialize() {
if (contacts == null) {
this.contacts = FXCollections.observableArrayList(contactDao.getAll());
}
}
Таким образом, мои приложения инициализируют методы, запускаемые в том порядке, в котором они были включены в admin.fxml userController, contactController, наконец, productController.
Я думаю, что мой вопрос сводится к тому, как я могу обмениваться объектами между дочерними контроллерами, чтобы при нажатии на новую вкладку с тем же списком ресурсов, что и на предыдущей, новый вызов базы данных не инициировался - в моем примере это происходит, когда Я загружаю пользовательскую страницу, ей нужен список контактов и список продуктов, но ContactController и ProductController нужны те же самые списки, и не должно быть необходимости делать еще один вызов БД.