JavaFX如何关闭阶段以同样的方式行事' x'窗口中的按钮

时间:2016-06-15 18:55:35

标签: 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);
}

当另一个阶段由' x'关闭时按钮" stage.setOnCloseRequest'被执行。但是在那个阶段我有一个关闭的按钮:

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

关闭,但方法' stage.setOnCloseRequest'没有被执行。

这种方法是错误的还是有办法以一种与' x'完全相同的方式关闭弹出窗口?窗口中的按钮?

1 个答案:

答案 0 :(得分:5)

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

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

stage.setOnHidden((WindowEvent we) -> {
    clientBLL.retrieve(clientID);
    updateWarning();
});

如果你真的需要使用onCloseRequest处理程序(例如因为你可能想要否决关闭),只需将你的关闭逻辑移动到一个方法并从两种类型的请求中调用它来关闭窗口。 / p>

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();
});