如何检测JFrame是否关闭?

6
我尝试了使用addWindowListener并实现windowClosing,它可以在按下关闭按钮时运行。但是当我使用Cmd+Q关闭时,windowClosing没有被调用。我该怎么解决呢?我需要通过键盘监听器检测Mac上的Cmd+Q,Windows上的Alt + F4吗?是否有通用的监听器可用于关闭窗口,无论是通过关闭按钮还是键盘,甚至是Ctrl+Alt+DeleteCmd+Option+Esc来强制关闭?谢谢。

2
https://dev59.com/SXI95IYBdhLWcg3w_zQN - dacwe
http://www.leepoint.net/notes-java/GUI/containers/10windows/12frameclose.html - Omid Nazifi
@TedWong,你找到解决问题的方法了吗?如果找到了,请发布你自己的答案。 - Igor
5个回答

2

我不确定Mac上的情况如何,但在Windows上,您可以从关闭按钮、Alt-F4以及通过任务管理器关闭应用程序来获得窗口关闭时的回调函数。如果您使用任务管理器终止进程,则不会收到回调,但我也不会期望这种情况发生。

您是否记得在JFrame实例上调用setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);


2

还有一种方法windowClosed(),尝试重写此方法,希望能对您有所帮助。


+1 例子 https://dev59.com/K2sz5IYBdhLWcg3w3btb#7613768 - mKorbel
似乎(对我来说)当他们点击 X 时会调用 windowClosing(但不是 windowClosed),而如果我编程调用 dispose,则会调用 windowClosed。很奇怪。 - rogerdpack

1
听起来你需要添加一些KeyListeners和一个工厂来检测特定操作系统所需的监听器。

查看


1
你可以使用这个OSX库: com.apple.eawt.ApplicationListener
handleQuit(ApplicationEvent event)

可能会解决问题。

来自文档的信息:

当应用程序收到退出事件时调用。当用户从应用程序菜单中选择退出,当用户键入 Command-Q 或者当用户控制点击 Dock 中的应用程序图标并选择退出时,就会生成此事件。您可以接受或拒绝退出请求。

当然,这个解决方案在 Windows 上不起作用。据我所知,目前还没有普适性解决方案,因此这可能是最好的方法。


0

正如你所说,当你点击(x)按钮时,windowClosing会被调用。我也在使用Mac,我通过Runtime.addShutDownHook来发送一个信号给应用程序,以便获取CMD+Q。

Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        // code to run when CMD+Q is pressed
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接