首页 > 解决方案 > 在另一个 JavaFX 窗口中关闭阶段时采取措施

问题描述

当我使用 Java Swing 时,我可以使用 JDialog 打开第二个窗口,并更新一个公共变量,以进行搜索,并使用 Try / finally 子句更新被调用的窗口中的数据。

也就是说,我打开第二个窗口,当我关闭时,在 finally 中执行一些操作。

在 JavaFX 中,当我启动 Stage 时,finally 会在之后立即执行,而不是在窗口关闭时执行。

我怎么能解决这个问题?等待关闭第二个窗口,执行操作?

我感谢您的关注。

public void abreTelaStatus(javafx.event.ActionEvent event){
        try {
            try{
                Stage stageSt     = new Stage();
                Parent rootStatus = FXMLLoader.load(getClass().getResource("/Visao/Status.fxml"));
                Scene sceneStatus = new Scene(rootStatus);        

                sceneStatus.addEventHandler(KeyEvent.KEY_PRESSED, (KeyEvent t) -> {
                    if (t.getCode() == KeyCode.ESCAPE) {
                        stageSt.close();
                    }
                });

                stageSt.setScene(sceneStatus);
                stageSt.setTitle("Cadastro de Status");
                stageSt.initModality(Modality.WINDOW_MODAL);
                stageSt.initOwner(((Node)event.getSource()).getScene().getWindow());
                stageSt.initStyle(StageStyle.UTILITY);
                stageSt.show();
            } finally{
                System.out.println("Finally - Cod. Status: " + UtilVar.sCodigo);
                //Execute action...
            }
        } catch (IOException ex) {
            MsgAlert.msgBox(null, "Erro ao Criar Tela Cadastro de Status - Erro:: " + ex.getMessage(), "Alerta");
        }
    }

打印部分屏幕以更好地说明

在此处输入图像描述

第二个呼叫屏幕 在此处输入图像描述

通话画面,更新数据后 在此处输入图像描述

标签: javafx

解决方案


有(至少)两种选择:

使用showAndWait(),等待窗口关闭后再继续:

try{
    Stage stageSt     = new Stage();
    Parent rootStatus = FXMLLoader.load(getClass().getResource("/Visao/Status.fxml"));
    Scene sceneStatus = new Scene(rootStatus);        

    sceneStatus.addEventHandler(KeyEvent.KEY_PRESSED, (KeyEvent t) -> {
        if (t.getCode() == KeyCode.ESCAPE) {
            stageSt.close();
        }
    });

    stageSt.setScene(sceneStatus);
    stageSt.setTitle("Cadastro de Status");
    stageSt.initModality(Modality.WINDOW_MODAL);
    stageSt.initOwner(((Node)event.getSource()).getScene().getWindow());
    stageSt.initStyle(StageStyle.UTILITY);
    // stageSt.show();
    stageSt.showAndWait();
} finally{
    System.out.println("Finally - Cod. Status: " + UtilVar.sCodigo);
    //Execute action...
}

我不相信这里需要 a ,因为在调用(or ) 和执行当前块中try-finally的代码之间没有机会退出代码块(但也许你正在实际应用程序中做其他事情)。show()showAndWait()finally

或者,您可以为事件注册一个处理程序onHidden,并在那里执行您的代码:

public void abreTelaStatus(javafx.event.ActionEvent event){
    try {

        Stage stageSt     = new Stage();
        Parent rootStatus = FXMLLoader.load(getClass().getResource("/Visao/Status.fxml"));
        Scene sceneStatus = new Scene(rootStatus);        

        sceneStatus.addEventHandler(KeyEvent.KEY_PRESSED, (KeyEvent t) -> {
            if (t.getCode() == KeyCode.ESCAPE) {
                stageSt.close();
            }
        });

        stageSt.setScene(sceneStatus);
        stageSt.setTitle("Cadastro de Status");
        stageSt.initModality(Modality.WINDOW_MODAL);
        stageSt.initOwner(((Node)event.getSource()).getScene().getWindow());
        stageSt.initStyle(StageStyle.UTILITY);
        stageSt.setOnHidden(e -> {
            System.out.println("Finally - Cod. Status: " + UtilVar.sCodigo);
            //Execute action...
        });
        stageSt.show();
    } catch (IOException ex) {
        MsgAlert.msgBox(null, "Erro ao Criar Tela Cadastro de Status - Erro:: " + ex.getMessage(), "Alerta");
    }
}

您还可以考虑使用DialogAPI,它具有从显示对话框返回数据的功能。


推荐阅读