簡體   English   中英

從 Java 應用程序中的停靠欄圖標捕獲“退出”

[英]Capture "quit" from dock icon in Java App

在 OS X 上(也可能在 Windows 上,但還沒有嘗試過),我需要通過確認來中斷退出應用程序的選擇。 注意:這不是窗口上的關閉按鈕,而是從 Dock 圖標和應用程序菜單中選擇退出。 順便說一句,如果它們不同,那么我需要兩個聽眾。 覆蓋processWindowEvent並設置setDefaultCloseOperation()似乎不起作用。

注意:我找到了適用於 Mac 的解決方案,並從接受的答案中包含了適用於 Windows 的代碼。 見下文。

既然你提到了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();
        }
    }
});

好的,如果其他人對此感興趣,以下是我發現在我的情況下有效的方法:

編輯更新:我已經在 Windows 10 和 OSX Yosemite 上進行了測試,並且可以正常工作。 我在下面合並了 James Wierzba 的代碼。

為 Apple 退出處理程序創建一個單獨的類文件(Apple 庫不包含在 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 上進行編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM