comment puis-je obtenir un élément dans JavaFx à l'aide d'un id?
Je suis nouveau sur le FXML et je suis en train de créer un gestionnaire d'événements pour tous les clics sur le bouton à l'aide d'un switch
. Toutefois, pour ce faire, j'ai besoin d'obtenir les éléments à l'aide de l'id. J'ai essayé ce qui suit, mais pour une raison quelconque (peut-être parce que je suis en train de faire dans la classe de contrôleur et de ne pas sur-le-main), je reçois une exception de dépassement de pile.
public class ViewController {
public Button exitBtn;
public ViewController() throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("mainWindow.fxml"));
Scene scene = new Scene(root);
exitBtn = (Button) scene.lookup("#exitBtn");
}
}
Alors comment vais-je obtenir un élément (un bouton par exemple) en utilisant son id comme une référence?
Le fxml bloc pour le bouton:
<Button fx:id="exitBtn" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleButtonClick" text="Exit" HBox.hgrow="NEVER" HBox.margin="$x1" />
Vous mélangez le
id
et fx:id
balises. lookup
est basé sur id
. fx:id
est pour l'injection dans la classe du contrôleur.c'est une classe de contrôleur
ok, mais quand même. comment dois-je faire? La façon dont j'ai essayé ne fonctionne pas comme je ne peux pas obtenir la scène du fichier fxml
Alors, pourquoi êtes-vous de charger le fxml dans le contrôleur? Qui n'a pas de sens: vous créez une instance du contrôleur qui charge le FXML, au cours de laquelle un autre contrôleur instance est créée...
OriginalL'auteur Rakim | 2016-01-28
Vous devez vous connecter pour publier un commentaire.
Utiliser un contrôleur de classe, de sorte que vous n'avez pas besoin d'utiliser une recherche. Le
FXMLLoader
permettra d'injecter les champs dans le contrôleur pour vous. L'injection est garanti pour arriver avant lainitialize()
méthode (si vous en avez un) est appeléeSpécifier la classe de contrôleur dans l'élément racine de votre FXML:
Enfin, charger le FXML à partir d'une classe autre que votre contrôleur de classe (peut-être, mais pas nécessairement, votre
Application
classe) avecprivate Button exitBtn ;
n'est pas le véritable exitBtn. C'est juste un bouton de référence. Donc, si un autre gestionnaire de bouton (c'est à direopenBtn
) points à la même méthode, alors que le bouton vahide()
et de ne pas le bouton de sortieNon, parce que dans ce cas, la condition de l'
if
serait la valeur false. (Tous les objets Java sont accessibles par référence, de toute façon: si vous avez utilisé une recherche, ce qui serait vraiment dur dans le contrôleur, vous auriez encore une référence à la touche.)Voir si les mises à jour de la réponse de le rendre plus clair.
Bien, je vois. Je n'ai pas réalisé que l'utilisation d'un nom de variable identiques à celles définies dans
fx:id="exitBtn"
fonctionne comme une référenceLe
fx:id
spécifie le nom du champ dans lequel le FXML Chargeur d'injecter de l'objet créé par l'élément.OriginalL'auteur James_D