Comment appeler des fonctions sur la scène en JavaFX contrôleur du fichier
Je suis à l'aide de javafx le long de avec fxml, donc j'utilise la contrôleur pour le codage réel. J'ai besoin de faire quelques opérations sur la scène, tels que l'obtention de x ou y de la position de l'axe. J'ai essayé stage.getX()
& stage.getY
, mais ils ne fonctionnent pas(le nom de scène est haute lited que l'erreur). Comment puis-je utiliser de telles fonctions dans mon contrôleur? J'ai essayé de faire ceci dans mon fichier principal:
public int locationX = stage.getX();
et
public double locationX = stage.getX();
Mais il ne fonctionne pas, rend l'ensemble du programme, une grosse erreur.
Alors, comment puis-je arriver à faire de telles fonctions dans mon fichier de contrôleur? Ai-je besoin d'importer quelque chose ou de faire quelque chose comme ci-dessus d'une autre manière?
error: cannot find symbol
locationX = stage.getX();
symbol: variable stage
location: class FXMLController
Je sais que la "scène" est manquant. Mais comment obtenir la "scène" dans mon contrôleur?
OriginalL'auteur Pratik Anand | 2013-05-19
Vous devez vous connecter pour publier un commentaire.
De votre racine dans le Volet
fxml
fichier :Vous pouvez obtenir le stade de par:
Vous avez une référence à la scène, vous pouvez faire ce que vous voulez.
C'est peut-être un autre problème,ouvrez une nouvelle question et après le code de
DarknessFXMLController
et votrefxml
fichier.Vous avez
NPE
car aucunstage
est attaché à lascene
sur appel deload()
(oùload()
en interne invoqueinitialize()
).emballage
getScene()
dansPlatform.runLater(...)
évite queNPE
pour moi.OriginalL'auteur
La Solution De L'Échantillon
Vous pouvez initialiser le stade, dans le contrôleur, en utilisant la technique à partir de: Passage de Paramètres JavaFX FXML.
Voici un exemple de programme qui crée une fenêtre de l'utilitaire qui suit les x et y les coordonnées de l'écran lorsque vous faites glisser la fenêtre de l'utilitaire de autour de. Le contenu de la fenêtre de l'utilitaire sont rendus dans une fxml défini volet.
StageTrackingSample.java
StageTrackingController.java
stagetracking.fxml
Des Solutions De Rechange
tarrsalah de réponse de seulement faire de la scène à partir d'un @FXML composant est également un bon moyen si vous savez que le composant racine du contrôleur a déjà été ajouté à une scène qui a déjà été ajouté à la scène (ce qui est souvent le cas, quand quelque chose comme un bouton gestionnaire d'événement est déclenché).
Une autre façon de le faire est similaire à tarrsalah de la réponse, mais pour l'utiliser ChangeListeners sur la scène de la propriété d'un @FXML nœud et la fenêtre de propriété de la modification de la scène. Cela vous permet de suivre les changements de la scène et de la scène dans le cas où le volet est déplacé à une nouvelle scène ou sur scène. La plupart du temps, vous n'avez pas besoin de suivre ces changements même si, comme la plupart des panneaux sont simplement ajoutés à une seule scène qui reste sur une scène.
Réponses à d'autres Questions et Commentaires
tarrsalah déjà fourni une simple réponse.
Le seul problème avec une simple réponse dans ce cas est qu'il risque de ne pas fournir le contexte nécessaire pour répliquer à la réponse de la solution et de l'adapter à votre travail.
J'ai fait ma réponse aussi simple que je le pouvais, mais, malheureusement, même les plus élémentaires, JavaFX FXML application nécessite un peu de code et de la majoration pour travail.
Ne pas utiliser FXML lorsque vous êtes le premier à commencer à développer votre initiale Java et les applications JavaFX. Au lieu de cela, il suffit de coller avec la norme API Java dans votre JavaFX code, et pour laquelle il y a beaucoup plus de tutoriels ainsi que l'excellent L'Ensemble De L'Échantillon de référence.
Assurez-vous avant le début de JavaFX, que vous avez rempli tous les Java Tutoriel Pistes Couvrant les Bases. Seulement les bases de Java sont nécessaires pour commencer à utiliser JavaFX, vous n'avez pas besoin de bifurquer dans l'apprentissage de Java Enterprise Edition et pouvez oublier le Swing.
Envisager d'utiliser SceneBuilder et FXML pour des applications plus importantes une fois que vous avez écrit quelques-uns de base des applications JavaFX, codée à la main certaines mises en page en fonction de l'API Java et atteint un niveau de confort avec les technologies de base. À ce moment, vous trouverez probablement que l'apprentissage FXML est assez simple. FXML les attributs et les éléments ne sont que le reflet de l'Api Java.
Je ne peux pas vraiment le faire car je ne sais pas ce qui est inhabituel pour vous.
Si il y a certaines parties du code que vous ne pouvez pas comprendre à travers vos propres connaissances ou de recherche, créer un nouveau StackOverflow question pour chaque concept difficile.
Mis à jour pour répondre à Pratique du commentaire.
merci. J'ai déjà des pratiques de base de java pour 1/2 mois, de swing pour plus tard 1/2 et enfin venu de fx. J'ai utilisé pour écrire du code simple javafx(non-fxml) des programmes. Je suis à l'aide de scenebuilder pour presque toutes mes fxml apps.
OriginalL'auteur
Bien, la réponse la plus simple à...
Dans votre classe Principale créer une instance (un objet) de votre Contrôleur de classe:
Dans votre Contrôleur de classe vous devriez mettre une méthode de "l'extraction" (un setter):
Et puis vous pouvez ajouter un bouton plein ecran 😉
primaryStage.setFullScreen(!primaryStage.isFullScreen())
Vrai. Merci :))
Une autre façon d'utiliser les stades est avec StageHelper.getStages().get(index)
OriginalL'auteur
Ce fil est vieux, mais j'ai découvert quelque chose de pertinent à elle, tout à fait par accident. Ce que je pensais était une erreur de codage qui ne devrait pas avoir travaillé, mais il l'a fait. Dans la classe du contrôleur, il suffit de déclarer la variable membre suivant:
@FXML privé, l'Étape;
m'a donné accès à la scène dans le contrôleur, un peu comme j'ai accès à un widget dans le fxml document. Je n'ai pas trouvé de documentation que ce soit le cas, mais je vais vous avouer que je suis noob de JavaFX (bien que un vieux routier de la Balançoire). Mais il semble fonctionner. Peut-être que c'est dangereux de compter sur elle si?
OriginalL'auteur
Avec *.FXML des fichiers et des Contrôleurs pas avec les Principaux Événements ou , utilisez ceci :
élément, peut être n'importe quel contrôle ou l'élément que vous FXML, dans mon cas, c'est un AnchorPane:
OriginalL'auteur
La meilleure approche est de créer un nouveau contrôleur et passer le
stage
par le constructeur (n'utilisez pas defx:controller
sur fichier FXML), sinon lestage
seranull
quandinitialize()
est appelé (À ce moment-là, oùload()
appelleinitialize()
, pas destage
est attaché à lascene
, d'où lescene
'sstage
estnull
).OriginalL'auteur