L'ouverture de plusieurs fenêtres avec JavaFX
Je suis en train d'ouvrir plusieurs fenêtres avec JavaFX, j'ai un eventlistener qui ouvre une nouvelle fenêtre lorsque l'on clique sur un bouton, il ressemble à ceci:
@FXML
private void joinAction() {
Parent root;
try {
Stage stage = (Stage) joinButton.getScene().getWindow();
stage.close();
root = FXMLLoader.load(getClass().getResource("main.fxml"));
stage = new Stage();
stage.setTitle("TuneUs");
stage.setScene(new Scene(root));
stage.show();
} catch (IOException e) {e.printStackTrace();}
}
la première fenêtre s'ouvre, et la nouvelle s'ouvre, mais mon problème est de récupérer les évènements de travailler avec mon deuxième fenêtre
dans main.fxml
j'ai cette ligne:
<TextField id="chat_bar" onAction="#sendChat" layoutX="14.0" layoutY="106.0" prefHeight="22.0" prefWidth="403.0"/>
Puis, dans ma classe de contrôleur, j'ai cette méthode:
@FXML
private void sendChat() {
System.out.println("test");
}
mais l'Ide est de me dire que; pas de contrôleur spécifié pour l'élément de niveau supérieur
Donc, ma question est: Dois-je créer plusieurs classes de contrôleur ou puis-je utiliser un seul pour plusieurs windows si oui, comment?
- Créer un contrôleur de classe pour chaque fichier FXML (indépendamment de la façon dont beaucoup de fenêtres/les étapes que vous avez).
- Vous pouvez dire à l'FXMLLoader avec setController où est le contrôleur qui contient les méthodes de gestionnaire d'événement. Si le chargeur de voir, par exemple, un
onAction="#sendChat"
il va chercher dans l'objet de contrôleur pour une méthode sendChat qui est annoté avec@FXML
. - Donc, si j'ai beaucoup de FXML fichiers que je vais avoir une tonne de fichiers pour mon contrôleurs
- Oui: je n'ai jamais trouvé que, pour être un problème. @Vertex fournit un mécanisme différent qui pourrait être utilisé mais seulement dans des cas très simples (pas injecté des champs, pas de
initialize()
méthode). J'ai ajouté une réponse.
Vous devez vous connecter pour publier un commentaire.
L'approche recommandée consiste à définir un contrôleur pour chaque FXML. Depuis les contrôleurs sont très léger, cela ne devrait pas ajouter beaucoup de frais généraux. Le contrôleur de votre main.fxml fichier peut être aussi simple que de
J'ai utilisé cette méthode avec un assez grand nombre de FXML fichiers et correspondant contrôleurs dans un seul projet, et n'ont pas eu de problèmes avec la gestion du code etc. Je recommande d'utiliser une convention de nommage de la forme
Main.fxml <-> MainController
.Si votre contrôleurs de la nécessité de partager les données, utiliser les techniques décrites dans Passage de Paramètres JavaFX FXML
Comme @Sommet de points dans les commentaires, il existe une approche alternative fournie par le
FXMLLoader.setController(...)
méthode. Donc dans votre exemple ci-dessus, vous pourriez faireCette approche est très bien si vous n'avez pas réglé tous les champs (contrôles) via FXML injection (c'est à dire avec un
fx:id
attribut dans le fxml et un correspondant@FXML
annotation dans le contrôleur). Si vous êtes, il sera très difficile de garder une trace de quand les champs ont été définis. En outre, si votrejoinAction
gestionnaire est appelé plusieurs fois, vous aurez de multiples instances du nœud créé par la main.fxml, mais qui partagent tous une seule instance du contrôleur (et, par conséquent, écraser le même injecté des champs). Notez également qu'avec cette approche, votreinitialize()
méthode sera invoquée les deux lorsque l'original fxml fichier est chargé, et lorsque le principal.fxml fichier est chargé, ce qui va certainement causer des effets indésirables.Une dernière remarque: si vous avez de nombreux FXML fichiers, et correspondant à des contrôleurs, vous voudrez peut-être regarder à l' la post-combustion.fx cadre. C'est un très léger cadre de mandats d'une convention de nommage sur FXML des fichiers et de leurs contrôleurs, et fournit aussi une (très) facile mécanisme de partage des données entre eux.
Vous devez ajouter un élément de premier niveau fx:contrôleur. Regardez cette réponse:https://stackoverflow.com/a/41316536/4247308