【问题标题】:JavaFX how to close stage to act the same way the 'x' button in the windowJavaFX如何关闭舞台以与窗口中的'x'按钮相同的方式
【发布时间】:2016-06-15 18:55:34
【问题描述】:

我有一个控制器,它以弹出窗口的形式打开一个新阶段:

@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”按钮完全相同的方式关闭弹出窗口?

【问题讨论】:

    标签: javafx


    【解决方案1】:

    setOnCloseRequest 处理程序在外部 请求关闭窗口时执行(即不是来自您的代码)。请参阅documentation。

    如果在窗口关闭后立即执行该逻辑就足够了,只需使用常规的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();
    });
    

    【讨论】:

      猜你喜欢
      • 2019-08-05
      • 1970-01-01
      • 2012-01-10
      • 2014-03-16
      • 2012-02-16
      • 2021-12-09
      • 2015-05-21
      • 1970-01-01
      • 2013-08-12
      相关资源
      最近更新 更多