【发布时间】:2023-04-10 16:32:01
【问题描述】:
我有一个可以打开多个窗口的 JavaFX 应用程序。每当从该窗口失去焦点时,该窗口内的数据就会记录到数据库中。 当用户想要关闭窗口时,应该触发一个事件处理程序,请求从数据库中删除元组。 我只希望当用户主动点击窗口右上角的 x 时发生这种情况,而不在应用程序完全退出时发生(例如,如果程序从操作系统启动栏或等效项)或以其他方式停止。
关闭事件处理程序存根类似于以下内容:
foo.setOnCloseRequest(new EventHandler<WindowEvent>()
{
@Override
public void handle(WindowEvent event)
{
try
{
barController.exec(Action.DELETE, item);
} catch (Exception e)
{
e.printStackTrace();
}
}
});
问题是,当我从 Ubuntu 的栏中停止程序时(例如),仍然为每个窗口调用此事件;并且每次测试的事件是WindowEvent.WINDOW_CLOSE_REQUEST 用户或应用程序是否关闭了窗口。
简单地说:有什么方法可以从“onCloseApplication”中划定“onUserCloseWindow”吗?
【问题讨论】:
-
您可以在后台执行数据库工作,在窗口关闭后不久。 (我个人会使用 30 秒的延迟。)
-
@VGR,除了在程序的可视化组件停止运行后让 GUI 驱动的应用程序执行具有潜在风险的后台任务的固有问题之外,您仍然会遇到同样的问题:应用程序无法知道哪些项目已被提名删除,哪些没有。我能看到的唯一简单且合理可行的解决方法是在窗口关闭时将关闭事件添加到时间戳队列中。那么您可以让 Application.stop() 测试任何早于最后一秒的时间戳,并相应地删除相关的。