I just started using JavaFX Scene Builder to build a small application.
It is made up of a controller class 'Login.java' which belongs to 'login.fxml', in which the FXML file 'registrierung.fxml' is loaded via a method called 'registrationClicked(ActionEvent event)':
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();
}
}
Now I want to get a reference to the stage of 'registrierung.fxml' in the controller class 'Registrierung.java' via the root node vboxRoot:
@FXML
private VBox vboxRoot;
Stage stage = (Stage) vboxRoot.getScene().getWindow();
However 'getScene()' always leads to a NullPointerException. The controller classes for both FXML files are adjusted in Scene Builder.
This is how I set up the rood node in '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">
What am I doing wrong?
vboxRootinitialized? - CubeJockeyvboxRootis injected by theFXMLLoader, it cannot possibly be initialized until after the controller is created. Hence it isnullhere. Moreover, the root of the FXML is not placed in aScene(or, consequently, aStage) until after theFXMLLoader'sloadmethod is completed (just look at the order of your code inregistrationClicked(...)). So you cannot possibly access theSceneor theStageuntil after the load process (including theinitalize()method) is complete. Access the window only when you need it, which is likely in an event handler. - James_D