JavaFX如何关闭stage以与';x';窗口中的按钮

JavaFX如何关闭stage以与';x';窗口中的按钮,javafx,Javafx,我有一个控制器,可以打开一个新的阶段作为弹出窗口: @FXML private void onClickPayments(ActionEvent event) throws IOException{ FXMLLoader loader = new FXMLLoader(getClass().getResource("ClientPayments.fxml")); Parent root = (Parent) loader.load(); ClientPaymentsCon

我有一个控制器,可以打开一个新的阶段作为弹出窗口:

@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);
}
当通过“x”按钮关闭另一个阶段时,将执行“stage.setOnCloseRequest”。但在那个阶段,我有一个按钮要关闭:

@FXML
private void onClickExit(ActionEvent event){
    ((Stage) ((Node) event.getSource()).getScene().getWindow()).close();
}
它关闭,但没有执行方法“stage.setOnCloseRequest”


此方法是否错误,或者是否有一种关闭弹出窗口的方式与窗口中的“x”按钮完全相同?

当有关闭窗口的外部请求时(即不是您的代码中的请求),将执行
setOnCloseRequest
处理程序。看

如果在窗口关闭后立即执行该逻辑就足够了,只需使用常规的
onHidden
处理程序即可:

stage.setOnHidden((WindowEvent we) -> {
    clientBLL.retrieve(clientID);
    updateWarning();
});
如果您确实需要使用
onCloseRequest
处理程序(例如,因为您可能想要否决关闭),只需将关闭逻辑移动到一个方法,并从两种类型的请求中调用它即可关闭窗口

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

@FXML
private void onClickExit(ActionEvent event){
    doClose();
    ((Node) event.getSource()).getScene().getWindow().hide();
}

stage.setOnCloseRequest((WindowEvent we) -> {
    controller.doClose();
});