从Java App中的dock图标捕获“退出”

时间:2015-09-03 20:12:25

标签: java

在OS X上(可能在Windows上但尚未尝试)我需要中断选择以确认退出应用程序。注意:这不是窗口上的关闭按钮,而是从Dock图标和应用程序菜单中选择退出。顺便说一句,如果它们不同,那么我需要两个听众。覆盖processWindowEvent并设置setDefaultCloseOperation()似乎不起作用。

注意:我找到了适用于Mac的解决方案,并从接受的答案中包含了Windows的代码。见下文。

2 个答案:

答案 0 :(得分:1)

由于您提到setDefaultCloseOoperation()我认为您在谈论JFrame

以下是如何做到这一点。

this.addWindowListener(new java.awt.event.WindowAdapter() 
{
    @Override
    public void windowClosing(java.awt.event.WindowEvent windowEvent) 
    {
        int ret = JOptionPane.showConfirmDialog(MyJFrame.this, "Are you sure you want to quit?");
        if(ret == JOptionPane.YES_OPTION)
        {
            dispose();
        }
    }
});

答案 1 :(得分:1)

好的,如果其他人对此感兴趣,我发现这符合我的情况:

编辑更新:我已经在Windows 10和OSX Yosemite上测试了这个并且它可以工作。我已经在下面加入了James Wierzba的代码。

为Apple退出处理程序创建一个SEPARATE类文件(苹果库不包含在Windows JDK中):

import com.apple.eawt.AppEvent;
import com.apple.eawt.Application;
import com.apple.eawt.QuitHandler;
import com.apple.eawt.QuitResponse;

public class AppleQuitHandler {
    public static void DoAppleQuit() {
        Application a = Application.getApplication();
        a.setQuitHandler(new QuitHandler() {
            @Override
            public void handleQuitRequestWith(AppEvent.QuitEvent quitEvent, QuitResponse quitResponse) {
                int ret = JOptionPane.showConfirmDialog(null, "Are you sure");
                if (ret == JOptionPane.YES_OPTION) {
                    // Go ahead and exit
                    quitResponse.performQuit();
                } else {
                    // Return to program
                    quitResponse.cancelQuit();
                }
            }
        }
    };
}

有条件地向根JFrame添加侦听器(Windows退出):

    String OS = System.getProperty("os.name").toLowerCase();
    if(OS.contains("win")) {
        myJFrame.addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                int ret = JOptionPane.showConfirmDialog(null, "Are you sure");
                if (ret == JOptionPane.YES_OPTION) {
                    songFrame.dispose();
                    System.exit(0);
                }
            }
        });
    }

最后添加AppleQuitHandler()的条件:

    String OS = System.getProperty("os.name").toLowerCase();
    if(OS.contains("mac")) {
        AppleQuitHandler.DoAppleQuit();
    }

您现在应该有一个适用于Mac和Windows的工作解决方案,以便从菜单和快捷键中捕获关闭。

注意:这未经过全面测试,但我确实在Mac和Windows上都尝试过。

仅供参考:您需要添加Apple库以在Windows上进行编译。