JavaFX - getScene() renvoie la valeur null
J'ai juste commencé à utiliser JavaFX Scene Builder pour créer une petite application.
Il est composé d'un contrôleur de la classe de Login.java "qui appartient à" ouvrir une session.fxml", dans lequel le fichier FXML 'registrierung.fxml' est chargé par une méthode appelée " registrationClicked(ActionEvent événement)':
public class Login {
@FXML
private void registrationClicked(ActionEvent event){
try{
((Node) (event.getSource())).getScene().getWindow().hide();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/fxml/registrierung.fxml"));
Parent root = (Parent) loader.load();
Stage stage = new Stage();
Scene scene = new Scene(root);
stage.setTitle("Registration");
stage.setScene(scene);
stage.setResizable(false);
stage.show();
} catch(IOException e){
e.printStackTrace();
}
}
Maintenant, je veux obtenir une référence à la scène de " registrierung.fxml "dans le contrôleur de la classe de Registrierung.java" via le nœud racine vboxRoot:
@FXML
private VBox vboxRoot;
Stage stage = (Stage) vboxRoot.getScene().getWindow();
Cependant, " getScene()' amène toujours à une NullPointerException. Les classes de contrôleur pour les deux FXML fichiers sont ajustés en Scène Builder.
C'est de cette façon que j'ai créé l'rood nœud 'registrierung.fxml':
<VBox fx:id="vboxRoot" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="267.0" prefWidth="355.0" stylesheets="@../css/styles.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="businesslogik.Registrierung">
Ce que je fais mal?
vboxRoot
initialisé?J'ai juste cité de la façon dont je configurer le nœud racine dans le fichier fxml et dans la classe du contrôleur. Veuillez prendre un coup d'oeil.
D'où ce code? Dans un gestionnaire d'événement?
Pour le moment c'est un champ dans la 'Registrierung.java le contrôleur de classe. Je suis nouveau sur JavaFX, mais pour moi, il semble être dans la bonne position.
Depuis
vboxRoot
est injecté par le FXMLLoader
, il ne peut pas être initialisé jusqu'à après que le contrôleur est créé. Par conséquent, il est null
ici. En outre, la racine du FXML n'est pas placé dans un Scene
(ni, par conséquent, une Stage
) jusqu'à l'après FXMLLoader
's load
méthode est terminé (il suffit de regarder l'ordre de votre code dans registrationClicked(...)
). De sorte que vous ne peut pas accéder à laScene
ou la Stage
jusqu'à ce que après le processus de chargement (y compris les initalize()
méthode) est complet. Accéder à la fenêtre uniquement lorsque vous en avez besoin, ce qui est probable dans un gestionnaire d'événement.
OriginalL'auteur The_Dude | 2015-05-26
Vous devez vous connecter pour publier un commentaire.
vous essayez d'obtenir de la scène pour un objet qui n'a pas été initialisé encore. si vous faisiez la même opération dans
ou si vous avez un événement qui déclenche une fois que vous cliquez sur quelque chose (qui s'exécute après la scène a chargé)
Ce serait le travail!
OriginalL'auteur
J'ai rencontré ce problème et l'ont trouvé en plaçant un appel à une méthode comme ceci (Quand la scène devient alors visible et est connecté au nœud, ce sera le feu):
Alors je peux faire quelque chose comme ceci plus tard:
Espère que cette aide.
OriginalL'auteur purring pigeon
La mise en œuvre de la Initializable interface ne fonctionne pas pour moi(Java 8).
La méthode getScene() retourne toujours null pour moi. J'ai donc dû effectuer les opérations suivantes:
Et dans le contrôleur, j'ai:
OriginalL'auteur Holgi P