javafx - 在另一个 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");
}
}
打印部分屏幕以更好地说明
解决方案
有(至少)两种选择:
使用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");
}
}
您还可以考虑使用Dialog
API,它具有从显示对话框返回数据的功能。
推荐阅读
- google-kubernetes-engine - 在 GKE 入口负载均衡器中公开 80/443 以外的端口?
- macos - 增加 catalina 上的共享内存大小
- python - 如何从python中的json读取字节?
- html - 使用 SVG 编码将鼠标悬停在 PNG 图像上时如何获得不同的颜色/填充/不透明度
- python - 轮廓的曲面图
- java - Java 在 x 时间段内调用 REST 服务,以定期间隔进行响应
- react-native - 试图在本机反应中将图像数据传递到另一个屏幕
- docusignapi - 调整 Docusign 的标志此处选项卡的大小
- ios - applicationDidEnterBackground 中的应用程序时未调用 applicationWillTerminate
- docker - Docker swarm 路由重定向不起作用