在OS X上(可能在Windows上但尚未尝试)我需要中断选择以确认退出应用程序。注意:这不是窗口上的关闭按钮,而是从Dock图标和应用程序菜单中选择退出。顺便说一句,如果它们不同,那么我需要两个听众。覆盖processWindowEvent
并设置setDefaultCloseOperation()
似乎不起作用。
注意:我找到了适用于Mac的解决方案,并从接受的答案中包含了Windows的代码。见下文。
答案 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上进行编译。