JavaFX第二阶段onCloseRequest

时间:2016-03-12 13:19:15

标签: javafx event-handling eventhandler

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

这是我的所作所为,但我得到了一个nullpointer异常:

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

    }

因为舞台尚未完全初始化,所以还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

由于您已经创建了SceneStage,因此您无法调用它们,或者您已经提到了NPE,正如您已经提到的那样。

在舞台上安装事件处理程序的一种方法是收听sceneProperty() tbTabPaneHome中的更改。

将节点添加到场景后,该属性将为您提供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);
            });
        });
    });
}

答案 1 :(得分:0)

您尝试完全在主舞台控制器中处理次要舞台吗?

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

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。

我遇到了相反的问题,即通过单击右上角的关闭来防止关闭二级窗口。我将研究setOnCloseRequest,看看是否有办法。

我还有另一个不相关的问题:我可以相对于主要的放置辅助中学吗?