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?

Est votre 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