JavaFX – getScene()返回null

我刚开始使用JavaFX Scene Builder来构建一个小应用程序。

它由一个属于’login.fxml’的控制器类’Login.java’组成,其中FXML文件’registrierung.fxml’通过一个名为’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(); } } 

现在我想通过根节点vboxRoot在控制器类’Registrierung.java’中引用’registrierung.fxml’的阶段:

 @FXML private VBox vboxRoot; Stage stage = (Stage) vboxRoot.getScene().getWindow(); 

但是’getScene()’总是会导致NullPointerException。 在Scene Builder中调整两个FXML文件的控制器类。

这就是我在’registrierung.fxml’中设置rood节点的方法:

  

我究竟做错了什么?

您正在尝试获取尚未初始化的对象的场景。 如果你在做同样的操作

 @Override public void initialize(URL fxmlFileLocation, ResourceBundle resources) { Stage stage = (Stage) vboxRoot.getScene().getWindow(); } 

或者如果你有一个事件,一旦你点击的东西触发(在场景加载后执行)

 @FXML private void action(ActionEvent event) throws IOException { Stage stage = (Stage) vboxRoot.getScene().getWindow(); } 

这会奏效!

我遇到过这个问题并通过调用这样的方法找到了(当场景变得可见并附加到节点时,这将触发):

  private void determinePrimaryStage() { rootPane.sceneProperty().addListener((observableScene, oldScene, newScene) -> { if (oldScene == null && newScene != null) { // scene is set for the first time. Now its the time to listen stage changes. newScene.windowProperty().addListener((observableWindow, oldWindow, newWindow) -> { if (oldWindow == null && newWindow != null) { primaryStage = (Stage)newWindow; } }); } }); }` 

然后我可以在以后做这样的事情:

 if(primaryStage == null) { Platform.runLater(()-.{...... }else { //do whatever } 

希望这可以帮助。