J'ai une application JavaFX standard qui étend l'application. La première page que je montre est un tableau de bord avec des boutons pour ouvrir d'autres applications. Tout va bien, la première application est une page admin appelée AdminController qui permet à l'utilisateur de faire des opérations CRUD sur les objets du modèle - utilisateur, contacts, produits chaque entité est un onglet sur la vue admin - donc dans mon Admin FXML principal (Utilisation de SceneBuilder) J'inclus les autres pages fxml en utilisant fx: inclure l'onglet utilisateurs, l'onglet contacts et l'onglet produits. Encore une fois ces inclus sont tous dans un Admin.fxml avec son propre contrôleur.Ordre d'initialisation du contrôleur JavaFx - Base de données appelée plusieurs fois
<Tab fx:id="contactsTab" onSelectionChanged="#goToContacts" text="Contact">
<content>
<fx:include source="/fxml/manager_contacts_tab.fxml" fx:id="contact" />
</content
<Tab/>
Mon idée était de charger les ressources chaque page aura besoin, les utilisateurs/contacts/produits dans la AdminController sorte que chaque fx: include je peut utiliser ces mêmes objets. Comme certains des onglets ont besoin de toutes ces ressources, comme les utilisateurs pour gérer les associations et d'autres onglets comme les produits, il suffit d'une liste de produits. Mon contrôleur principal ressemble à ceci Je
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
}
Logiquement dans ma tête, je pense que la méthode initialize pour AdminController va se lancer d'abord qui permettrait mon de mettre tous les objets qui je dois dans les contrôleurs de l'enfant depuis que je peux accéder à eux, mais ce qui se passe est que les contrôleurs enfants sont exécutés en premier, ex. avec ContactController
public class ContactController {
@FXML
public void initialize() {
if (contacts == null) {
this.contacts = FXCollections.observableArrayList(contactDao.getAll());
}
}
donc mes applications initialize exécuter des méthodes dans l'ordre dans lequel ils ont été inclus dans le Je pense que UserController de admin.fxml, contactController, enfin ProductController
ma question se résume à comment puis-je partager des objets entre l'enfant les contrôleurs de sorte que lorsqu'un nouvel onglet est cliqué qui a eu la même liste de ressources que le précédent, un nouvel appel de base de données n'est pas lancé - dans mon exemple, cela se produit lorsque je charge la page utilisateur, liste de contacts et liste de produits mais ContactController & ProductController a besoin de ces mêmes listes, il ne devrait pas être nécessaire de faire un autre appel DB.
Pour moi, ce n'est pas clair à 100% exactement ce que vous demandez ici. Que voulez-vous dire par un appel à une base de données? En règle générale, vous interrogez uniquement une base de données (à moins que vous ne la modifiez) et cela ne devrait prendre que ms pour se terminer. Sinon (si la base de données est suffisamment petite), vous pouvez le charger en mémoire lorsque votre programme démarre et ne pas le récupérer du tout dans vos contrôleurs. Par base de données, voulez-vous dire un tas de fichiers que vous avez sérialisés ou parlez-vous d'une base de données SQL? –
Ce que je fais typiquement avec un petit stockage est de définir une classe appelée "Data" et d'y stocker des ArrayLists qui contiennent des objets de base de données (comme des utilisateurs, des produits, etc.). Je charge ces ArrayLists quand mon programme commence. De cette façon, vos contrôleurs peuvent simplement appeler quelque chose comme Data.getContacts(); saisir tous les contacts. Si nous parlons d'une énorme base de données, les requêtes SQL doivent être exécutées pour récupérer l'information. –
Désolé devrait avoir clearified - c'est une base de données SQL, je pense que ma question est de savoir où faire l'appel à la base de données pour obtenir la liste des éléments que je travaille - ma première pensée était de faire tous les appels de base de données dans AdminController définir les ChildControllers, mais les contrôleurs enfants sont initialisés avant AdminController, donc l'appel doit avoir été fait et les contrôleurs enfants partageant la même liste de données ne sont pas visibles les uns par rapport aux autres, ex Contact/Admin Controllers - ContactController a besoin de contacts , mais aussi UserController (pour montrer les associations entre les deux). –