Passage de Paramètres JavaFX FXML
Comment puis-je passer des paramètres à une fenêtre secondaire dans javafx? Est-il un moyen de communiquer avec le contrôleur correspondant?
Par exemple:
L'utilisateur choisit un client à partir d'un TableView
et une nouvelle fenêtre s'ouvre, présentant le client de l'info.
Stage newStage = new Stage();
try
{
AnchorPane page = (AnchorPane) FXMLLoader.load(HectorGestion.class.getResource(fxmlResource));
Scene scene = new Scene(page);
newStage.setScene(scene);
newStage.setTitle(windowTitle);
newStage.setResizable(isResizable);
if(showRightAway)
{
newStage.show();
}
}
newStage
serait la nouvelle fenêtre. Le problème est, je ne peux pas trouver un moyen de dire au contrôleur où chercher pour le client de l'info (en passant l'id en paramètre).
Des idées?
Vérifiez pour voir si cela fonctionne aussi: stackoverflow.com/questions/14370183/...
avez-vous votre solution? pouvez-vous passer des paramètres? à partir d'un contrôleur à un autre contrôleur de fichier?
Oui. jewelsea a donné un livre niveau de l'explication. C'est pourquoi j'ai accepté sa réponse
avez-vous votre solution? pouvez-vous passer des paramètres? à partir d'un contrôleur à un autre contrôleur de fichier?
Oui. jewelsea a donné un livre niveau de l'explication. C'est pourquoi j'ai accepté sa réponse
OriginalL'auteur Alvaro | 2013-01-06
Vous devez vous connecter pour publier un commentaire.
Approche Recommandée
Cette réponse énumère les différents mécanismes pour passer des paramètres à FXML contrôleurs.
Pour les petites applications je recommande fortement de passer des paramètres directement à partir de l'appelant à la manette, c'est simple, simple et ne nécessite pas de supplément de cadres.
Pour les plus grands, les demandes plus complexes, il vaudrait la peine d'étudier si vous voulez utiliser L'Injection De Dépendance ou Bus D'Événement mécanismes au sein de votre application.
Passage de Paramètres Directement à Partir de l'Appelant vers le Contrôleur de
Transmettre des données personnalisées à un FXML contrôleur en récupérant le contrôleur du FXML chargeur instance et d'appel d'une méthode sur le contrôleur de l'initialiser avec les valeurs de données.
Quelque chose comme le code suivant:
Une nouvelle FXMLLoader est construit comme le montre l'exemple de code c'est à dire
new FXMLLoader(location)
. L'emplacement est une URL et vous pouvez générer un tel URL à partir d'un FXML ressource par:Attention à ne PAS utiliser une charge statique de la fonction sur la FXMLLoader, ou vous ne serez pas en mesure d'obtenir votre contrôleur de votre occurrence de loader.
FXMLLoader instances eux-mêmes ne savez rien à propos des objets du domaine. Vous n'avez pas de passer directement de l'application spécifique dans le domaine des objets dans le FXMLLoader constructeur, au lieu de vous:
Ce blog (par un autre écrivain) fournit une autre, mais semblable, exemple.
Réglage d'un Contrôleur de la FXMLLoader
Vous pouvez construire un nouveau contrôleur dans le code, la réussite de tous les paramètres que vous voulez à partir de votre correspondant dans le contrôleur constructeur. Une fois que vous avez construit un contrôleur, vous pouvez le mettre sur un FXMLLoader instance avant vous appelez la
load()
instance méthode.Pour configurer une manette sur un chargeur (en JavaFX 2.x) vous NE pouvez pas définir un
fx:controller
attribut dans votre fichier fxml.En raison de la limitation sur la
fx:controller
définition dans le FXML, personnellement, je préfère faire le contrôleur de l'FXMLLoader plutôt que de fixer le contrôleur dans le FXMLLoader.Avoir le Contrôleur de Récupérer les Paramètres d'un Externe Méthode Statique
Cette méthode est illustrée par Sergey réponse à Javafx 2.0 Comment-pour l'Application.getParameters() dans un Controller.java fichier.
Utiliser L'Injection De Dépendance
FXMLLoader prend en charge la dépendance des systèmes d'injection comme Guice, de Printemps ou Java EE CDI en vous permettant de personnaliser le contrôleur de l'usine sur le FXMLLoader. Cela fournit un rappel que vous pouvez utiliser pour créer l'instance du contrôleur avec les valeurs dépendantes de l'injectés par l'injection de dépendance du système. Il est un exemple de l'intégration de FXML par le Printemps de l'injection de dépendance du système (malheureusement le lien est mort et que le contenu est allé, si quelqu'un sait d'un exemple similaire, merci d'éditer cette question de la référence), mais c'est un peu moins agiles que pour l'usage de la nouvelle coutume de contrôleur de l'usine de fonctionnalités disponibles dans JavaFX 2.2.
Un vraiment agréable, propre de l'injection de dépendances approche est illustrée par la la post-combustion.fx cadre auprès d'un échantillon air-hacks application qui l'utilise. la post-combustion.fx s'appuie sur JEE6 javax.injecter pour effectuer l'injection de dépendance.
Utiliser un Événement de Bus
Greg Brown, l'original, le FXML spécification créateur et réalisateur, souvent suggère d'envisager l'utilisation d'un bus d'événement, comme la Goyave EventBus, pour la communication entre les FXML instancié contrôleurs et d'autres de l'application de la logique.
De suivi Q&Un
C'est une fonctionnelle de la solution à un problème. Une étape est retourné à partir de la
showCustomerDialog
fonction de telle sorte qu'une référence à elle peut être stockée par une classe externe qui souhaitent faire quelque chose, comme cacher la scène basée sur un bouton, cliquez sur dans la fenêtre principale, à une date ultérieure. Un autre orienté objet, la solution pourrait résumer la fonctionnalité et de la scène de référence à l'intérieur d'un CustomerDialog objet ou d'avoir un CustomerDialog étendre la Scène. Un exemple complet pour une interface orientée objet pour un dialogue personnalisé de l'encapsulation FXML, le contrôleur et le modèle de données est au-delà de la portée de cette réponse, mais peut faire un bon blog pour tout le monde enclin à en créer un.Informations complémentaires fournies par StackOverflow utilisateur nommé @dzim
Exemple pour le Printemps de Démarrage de l'Injection de Dépendances
La question de comment le faire "Le Printemps de Démarrage Chemin", il y avait une discussion à propos de JavaFX 2, qui je anserwered dans le permalien.
L'approche est toujours valide et testé en Mars 2016, au Printemps de Démarrage v1.3.3.LIBÉRATION:
https://stackoverflow.com/a/36310391/1281217
Parfois, vous pouvez transmettre les résultats à l'appelant, dans ce cas, vous pouvez consulter la réponse à la question connexe:
le bus d'événement site web a fait allusion aux états-unis, "mise à Jour 3/2013: L'EventBus a perdu de leur charme..."
Le DataFX Contrôleur de Cadres fournit quelques injection de soutien pour FXML contrôleurs: guigarage.com/2013/12/datafx-controller-framework-preview
Ajouté des Q&Une section pour répondre à la question d' @Anarkie
pour godshake est-il rien de simple pour faire ce petit travail en JavaFx? son très caractéristique commune à transmettre les données constructeur et javafx exige cet enfer de choses tous ensemble, juste pour envoyer un nom ou une valeur?
OriginalL'auteur jewelsea
javafx.de la scène.Classe de nœud a une paire de méthodes
setUserData(Objet)
et
Objet getUserData()
Qui vous pouvez utiliser pour ajouter vos informations sur le Nœud.
Donc, vous pouvez appeler la page.setUserData(info);
Et contrôleur peut vérifier si l'info est réglé. Aussi, vous pouvez utiliser ObjectProperty pour transférer des données de transfert, si nécessaire.
Observer une documentation ici:
http://docs.oracle.com/javafx/2/api/javafx/fxml/doc-files/introduction_to_fxml.html
Avant le membre de phrase "Dans la première version, la handleButtonAction() est taggés avec @FXML pour permettre le balisage définie dans le contrôleur du document pour l'appeler. Dans le deuxième exemple, le bouton de champ est annotée pour permettre à la chargeur pour régler sa valeur. La méthode initialize() est de la même façon annoté."
Donc, vous devez associer un contrôleur avec un nœud, et un utilisateur des données au nœud.
Scène.getScene() -> Scène.getRoot() -> recherche récursive avec les Parents.getChildrenUnmodifiable(). C'est très sale. Si quelqu'un pourrait suggérer qch mieux que sera grande.
Il semble Stade.getScene().getRoot() est la bonne manière! Merci
OriginalL'auteur Alexander Kirov
Dans cet exemple, nous allons utiliser 5 fichiers:
Tous les fichiers sont répertoriés dans leur intégralité en bas de ce post.
L'Objectif: Pour démontrer la transmission de valeurs de
Controller1
àController2
et vice versa.Le Déroulement Du Programme:
TextField
, unButton
, et unLabel
. Lorsque leButton
est cliqué, la deuxième fenêtre est chargé et affiché, y compris le texte entré dans laTextField
.TextField
, unButton
, et unLabel
. LeLabel
va afficher le texte saisi dans laTextField
sur la première scène.TextField
et en cliquant sur sonButton
, la première scène duLabel
est mis à jour pour afficher le texte saisi.C'est une démonstration très simple et pourrait sûrement se tenir à une certaine amélioration, mais devrait rendre le concept très clair.
Le code lui-même est également fait remarquer avec quelques détails de ce qui se passe et comment.
Main.java:
Controller1.java:
Controller2.java:
Layout1.fxml:
Layout2.fxml:
loader.setController(this)
et en ajoutant le contrôleur dans le fichier FXML une panne de l'applicationPas si le FXML est chargée par le contrôleur lui-même. Si vous chargez le FXML de la classe Principale, par exemple, vous pouvez définir le contrôleur dans le FXML fichier et obtenir une référence à l'aide de
loader.getController()
OriginalL'auteur Zephyr
Voici un exemple pour le passage de paramètres à un fxml document par le biais de l'espace de noms.
La définition de la valeur
External Text
pour les noms de variablelabelText
:FXMLLoader.CONTROLLER_KEYWORD
,FXMLLoader.LOCATION_KEY
,FXMLLoader.RESOURCES_KEY
et toute chaîne de caractères utilisée comme valeur pour l'fx:id
attribut.Merci pour cela, mon autre scène n'est qu'un conteneur affiche le texte précédemment montré sur ma scène principale. Maintenant, je peux avoir un fxml que je peux réutiliser dans de multiples endroits par initialiszing contenu via Namepace variables. Je n'ai pas " avoir à créer de nouvelles méthodes ou de modifier mon constructeur ou initalisers - juste ajoutée variable dans mon FXML et ajouter une ligne dans mon fxmloader code dans le contrôleur principal.
OriginalL'auteur user1503636
Cela FONCTIONNE ..
Rappelez-vous la première fois que vous imprimez le passage de la valeur, vous obtiendrez null,
Vous pouvez l'utiliser après votre windows chargé , de même pour tout ce que vous voulez de code pour n'importe quel autre composant.
reportez-vous à la question JavaFX FXML passage de paramètres du Contrôleur de A à B et à l'arrière, qui répond à vos question supplémentaire.
OriginalL'auteur diego matos - keke
Vous devez créer une Classe de Contexte.
Vous avez juste à définir instance de contrôleur de gestion dans l'initialisation à l'aide de
et vous pouvez l'utiliser à partir de l'ensemble de votre demande en utilisant simplement
Maintenant, vous pouvez passer des paramètres à n'importe quel contrôleur d'ensemble de l'application.
OriginalL'auteur CTN
Voici un exemple d'utilisation d'un contrôleur injecté par Guice.
Ici est une mise en œuvre concrète du chargeur:
Remarque cet exemple charge l'affichage dans le centre d'un BoarderPane qui est la racine de la Scène dans la Scène. Ce n'est pas pertinent pour l'exemple (détail de l'implémentation de mon cas d'utilisation spécifiques), mais a décidé de le laisser comme certains peuvent le trouver utile.
OriginalL'auteur jenglert
Oui, vous pouvez, vous devez ajouter dans le premier contrôleur de
puis dans la seconde déclarer un client puis au fond de vous, contrôleur :
OriginalL'auteur Montassar Bouagina
J'ai une méthode beaucoup plus simple de créer une instance de la classe à l'aide de la méthode initialize. J'ai cherché sur Internet plusieurs jours en attendant de trouver ce vraiment simple méthode.
Déclarer une instance de votre classe:
//définition de la variable utilisée pour l'instance de la classe principale
Déclarer votre classe comme suit:
Définir une méthode dans votre classe comme suit:
Puis appeler la méthode dans la méthode initialize:
OriginalL'auteur Jeremy
Vous pouvez décider d'utiliser un public observables liste pour stocker des données publiques, ou tout simplement créer une méthode de définition de stocker les données et les récupérer à partir de la manette correspondante
OriginalL'auteur Nospaniol Noah