JavaFX如何关闭阶段以相同的方式在窗口中使用“ x”按钮

Dua*_*des 3 javafx

我有一个控制器,它将弹出一个新的阶段:

@FXML
private void onClickPayments(ActionEvent event) throws IOException{
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ClientPayments.fxml"));
    Parent root = (Parent) loader.load();
    ClientPaymentsController controller = (ClientPaymentsController) loader.getController();
    Scene scene = new Scene(root);
    Stage stage = new Stage();
    stage.setScene(scene);
    stage.initModality(Modality.APPLICATION_MODAL);

    stage.setResizable(false);
    stage.setOnCloseRequest((WindowEvent we) -> {
        clientBLL.retrieve(clientID);
        updateWarning();
    });

    stage.show();
    controller.setClientID(clientID);
}
Run Code Online (Sandbox Code Playgroud)

当通过“ x”按钮关闭另一个阶段时,将执行“ stage.setOnCloseRequest”。但是在那个阶段,我有一个按钮可以关闭:

@FXML
private void onClickExit(ActionEvent event){
    ((Stage) ((Node) event.getSource()).getScene().getWindow()).close();
}
Run Code Online (Sandbox Code Playgroud)

它关闭,但未执行方法“ stage.setOnCloseRequest”。

此方法是否错误,或者是否有一种方法可以完全类似于窗口中的“ x”按钮来关闭弹出窗口?

Jam*_*s_D 5

setOnCloseRequest当有外部请求关闭窗口时(即代码中没有一个),将执行该处理程序。请参阅文档

如果足以关闭窗口立即执行该逻辑,则只需使用常规onHidden处理程序即可:

stage.setOnHidden((WindowEvent we) -> {
    clientBLL.retrieve(clientID);
    updateWarning();
});
Run Code Online (Sandbox Code Playgroud)

如果确实需要使用onCloseRequest处理程序(例如,因为可能要否决关闭),则只需将关闭逻辑移至某个方法,然后从两种类型的请求中调用它即可关闭窗口。

public void doClose() {
    clientBLL.retrieve(clientID);
    updateWarning();
}

@FXML
private void onClickExit(ActionEvent event){
    doClose();
    ((Node) event.getSource()).getScene().getWindow().hide();
}
Run Code Online (Sandbox Code Playgroud)

stage.setOnCloseRequest((WindowEvent we) -> {
    controller.doClose();
});
Run Code Online (Sandbox Code Playgroud)