JavaFX 二级阶段 onCloseRequest

JavaFX secondary stage onCloseRequest

我在点击右上角的关闭后关闭二级阶段时遇到了一个小问题。 我正在使用带控制器的 fxml class,我需要一种方法来处理这种情况。

这是我所做的,但我得到一个空指针异常:

   @Override
    public void initialize(URL location, ResourceBundle resources) {
        Stage stage = (Stage) tbTabPaneHome.getScene().getWindow();
        stage.setOnCloseRequest(e -> {
            Platform.exit();
            System.exit(0);
        });

    }

因为stage还没有完全初始化,还有什么想法吗?

由于尚未创建 SceneStage,您不能调用它们,否则您会得到一个 NPE,正如您已经提到的。

在舞台上安装事件处理程序的一种方法是监听 tbTabPaneHomesceneProperty() 中的变化。

将节点添加到场景后,属性 将为您提供 Scene 实例。

但是场景还没有添加到Stage,所以你需要等到这个完成,Platform.runLater():

public void initialize() {
    tbTabPaneHome.sceneProperty().addListener((obs, oldScene, newScene) -> {
        Platform.runLater(() -> {
            Stage stage = (Stage) newScene.getWindow();
            stage.setOnCloseRequest(e -> {
                Platform.exit();
                System.exit(0);
            });
        });
    });
}

您是否尝试过在主级控制器中完全处理您的次级级?

我想通过我的主应用程序控制器中的按钮或帮助菜单隐藏或显示帮助 windows。类似于以下内容:

public Button helpBtn;
Stage anotherStage = new Stage();
boolean secondaryInitialyzed = false;
boolean secondaryShowing = false;
public void showOrHideHelp(ActionEvent actionEvent) throws IOException {
if (!secondaryInitialyzed){
    Parent anotherRoot = FXMLLoader.load(getClass().getResource("mySecondaryStage.fxml"));
    anotherStage.setTitle("Secondary stage");
    Scene anotherScene = new Scene(anotherRoot, 500, 350);
    anotherStage.setScene(anotherScene);
    secondaryInitialyzed = true;
}
if (secondaryShowing){
    anotherStage.hide();
    secondaryShowing = false;
    helpBtn.setText("Show Help");
}
else {
    anotherStage.show();
    secondaryShowing = true;
    helpBtn.setText("Hide Help");
}

它确实有效,您可能有一种方法可以在主控制器中处理您的 setOnCloseRequest。

我有相反的问题,即通过单击右上角的关闭来防止关闭二级阶段 window。我会查看 setOnCloseRequest,看看是否有办法。

我还有一个不相关的问题:我可以参考主要的来定位次要的吗?