JavaFX-getScene()返回null

JavaFX-getScene()返回null,java,nullpointerexception,javafx-8,Java,Nullpointerexception,Javafx 8,我刚开始使用JavaFX场景生成器构建一个小应用程序 它由属于“Login.fxml”的控制器类“Login.java”组成,其中通过名为“registrationClicked(ActionEvent event)”的方法加载fxml文件“registrierung.fxml”: 现在,我想通过根节点vboxRoot获取对控制器类“registireRung.java”中“registireRung.fxml”阶段的引用: @FXML private VBox vboxRoot; Stage

我刚开始使用JavaFX场景生成器构建一个小应用程序

它由属于“Login.fxml”的控制器类“Login.java”组成,其中通过名为“registrationClicked(ActionEvent event)”的方法加载fxml文件“registrierung.fxml”:

现在,我想通过根节点vboxRoot获取对控制器类“registireRung.java”中“registireRung.fxml”阶段的引用:

@FXML
private VBox vboxRoot;

Stage stage = (Stage) vboxRoot.getScene().getWindow();
但是,“getScene()”总是导致NullPointerException。两个FXML文件的控制器类都在场景生成器中进行调整

这是我在“registerirung.fxml”中设置rood节点的方式:

<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">


我做错了什么

您正在尝试为尚未初始化的对象获取场景。如果你在医院做同样的手术

@Override 
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
    Stage stage = (Stage) vboxRoot.getScene().getWindow();
}
或者,如果有一个事件在单击某个对象后触发(在加载场景后执行)


这会有用的

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

之后我可以做类似的事情:

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

希望这有帮助。

实现可初始化接口对我来说不起作用(Java 8)。 getScene()方法始终为我返回null。因此,我必须做以下工作:

FXMLLoader loader = new FXMLLoader(getClass().getResource("MyGui.fxml"));
Parent root = (Parent)loader.load();
//do stage and scene stuff - i skip it here
MyController controller = (MyController)loader.getController();
stage.setOnShown(controller::adjustUI);
在控制器中,我有:

public void adjustUI(WindowEvent event) {
    Scene scene = myComponent.getScene();
    //do stuff and do ui adjustments here
}

您的
vboxRoot
是否已初始化?我刚才引用了在fxml文件和控制器类中设置根节点的方法。请看一下,代码在哪里?在事件处理程序中?目前它是“Registrierung.java”控制器类中的一个字段。我不熟悉JavaFX,但对我来说它似乎处于正确的位置。由于
vboxRoot
是由
FXMLLoader
注入的,因此在创建控制器之前,它不可能被初始化。因此,此处为
null
。此外,在
fxmloader
load
方法完成之前(只需查看
注册点击(…)
)中的代码顺序),FXML的根不会放置在
场景中(或因此而放置在
阶段中)。因此,在加载过程(包括
initalize()
方法)完成之前,您不可能访问
场景
阶段
。仅在需要时访问该窗口,这可能是在事件处理程序中。
if(primaryStage == null) {
    Platform.runLater(()-.{......
}else {
   //do whatever
}
FXMLLoader loader = new FXMLLoader(getClass().getResource("MyGui.fxml"));
Parent root = (Parent)loader.load();
//do stage and scene stuff - i skip it here
MyController controller = (MyController)loader.getController();
stage.setOnShown(controller::adjustUI);
public void adjustUI(WindowEvent event) {
    Scene scene = myComponent.getScene();
    //do stuff and do ui adjustments here
}