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?
vboxRoot
initialized? – HulenvboxRoot
is injected by theFXMLLoader
, it cannot possibly be initialized until after the controller is created. Hence it isnull
here. Moreover, the root of the FXML is not placed in aScene
(or, consequently, aStage
) until after theFXMLLoader
'sload
method is completed (just look at the order of your code inregistrationClicked(...)
). So you cannot possibly access theScene
or theStage
until after the load process (including theinitalize()
method) is complete. Access the window only when you need it, which is likely in an event handler. – Excitant