【问题标题】:Javafx stage is nullJavafx 阶段为空
【发布时间】:2016-11-17 12:56:08
【问题描述】:

我这里有两个控制器authcontrollermaincontroller。方法注册打开新窗口 - register.fxml。

register.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                Stage stage = new Stage();
                AnchorPane pane = null;
                try {
                    pane = FXMLLoader.load(getClass().getResource("/fxml/register.fxml"));
                } catch (IOException e) {
                    e.printStackTrace();
                }

                stage.setTitle("Регистрация в системе");
                Scene scene = new Scene(pane, 600, 450);
                stage.setResizable(false);
                stage.setScene(scene);
                stage.show();
            }
        });

然后在第二个控制器中我有方法初始化,我尝试从第一个窗口获取Stage

@Override
    public void initialize(URL location, ResourceBundle resources)  {
    Stage stage = (Stage) tabOnePane.getScene().getWindow();

}

tabOnePane 是第二个窗口的选项卡。但是当我尝试这样做时,我的Stage 始终为空。但是,如果我尝试在另一个句柄方法中获取Stage,我可以做到。当我的第二个窗口加载后如何获取第一个窗口的Stage

第二个控制器实现接口Initializable

【问题讨论】:

  • 这样做是个坏主意。如果您在初始化方法中获得Window,则依赖于将tabOnePane 添加到场景中并将该场景添加到窗口中。这使得代码难以维护。您可能应该找到一种方法来从控制器类之外对 stage 执行任何操作。在您完成加载 fxml 之前,您是如何设法将 tabOnePane 添加到场景中的?
  • 我使用 fx:id 从 fxml 文件添加了 tabOnePane。不幸的是,我需要在那个课程中使用这个阶段,因为它给了我稍后在第二堂课中使用的属性。

标签: java javafx initialization scene stage


【解决方案1】:

首先,您永远无法访问 Controller 中的初始化方法中的阶段。 其次只需向控制器添加一个方法,如 setStage(Stage stge) 然后像这样加载 fxml 以将阶段传递给控制器​​:

    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("/root/mainGui.fxml"));
    Parent root = loader.load();
    Scene scene = new Scene(root, 500, 400);
    controllerInterface ctrl = loader.getController();
    ctrl.setStage(primaryStage);

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2012-10-11
    • 2016-08-29
    相关资源
    最近更新 更多