簡體   English   中英

在 OS X 上的 Java swing 中設置默認應用程序圖標圖像

[英]Setting the default application icon image in Java swing on OS X

我正在嘗試為 Jar 文件設置圖標圖像:

setIconImage(new ImageIcon(getClass().getResource("logo.png")).getImage());

在 Mac OS X 10.7.4 中運行時,出現以下錯誤:

Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextGetCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextSetBaseCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextGetCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextSetBaseCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextGetCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextSetBaseCTM: invalid context 0x0

setIconImage不設置 jar 圖標。 它將為該JFrame的最小化窗口設置圖標。 jar 圖標(控制 finder 圖標和 Dock 應用程序圖標)不能在 jar 文件本身中設置。 您只需獲得操作系統提供的默認圖標。 您將需要使用諸如適用於 OS X 的 JarBundler 或適用於 Windows 的Launch4J之類的東西來包裝它。

您可以在應用程序運行時設置應用程序停靠圖標,請參閱com.apple.eawt.Application.setDockIconImage 但它並不完美,因為當您雙擊您的 jar 時,它會使用通用 java 圖標在 Dock 中啟動,並且僅在 Java 代碼開始運行時一兩次反彈后切換到您的自定義圖標。 另外,我認為它不會為未運行的 jar 設置停靠圖標(並不是說您無論如何都可以將 jar 文件拖到停靠中 - 似乎對我不起作用)。

以下代碼演示了您可以設置的不同圖像:

import com.apple.eawt.Application;
import javax.swing.*;

class SetIcon extends JFrame {

    SetIcon() {
        setIconImage(new ImageIcon("doc.png").getImage());
        Application.getApplication().setDockIconImage(
            new ImageIcon("app.png").getImage());
    }

    public static void main(String args[]) {
        SetIcon s = new SetIcon();
        s.setVisible(true);
    }
}

只是為了添加我在純 Java 應用程序中添加 MacOSX Dock 圖標的最終解決方案:

public boolean exists(String className)
{
    try {
        Class.forName( className, false, null );
        return true;
    }
    catch (ClassNotFoundException exception) {
        return false;
    }
}

public void setIcon( BufferedImage icn )
{
    if ( exists( "com.apple.eawt.Application" ) )
    {
        com.apple.eawt.Application.getApplication().setDockIconImage( icn );
    }
}

這會默默地確保類可用並執行setDockIconImage()方法。 對我來說效果很好,並且不會干擾其他平台。

您可以將.icns文件放在應用程序包的Contents/Resources目錄中,並在Info.plist文件中引用它。 例如,名為ApplicationName.icns的文件將被以下形式的<dict>條目引用:

<key>CFBundleIconFile</key>
<string>ApplicationName.icns</string>

這里提到了一些相關的細節。

java -Xdock:icon=/path/myIcon.png myApp

正如我經歷了你的錯誤,它與升級到 10.7.4 后開始出現的 MacOS jdk 相關

如果這對您有幫助,請通過操作:

Java 9+ 解決方案:

Taskbar.getTaskbar().setIconImage(myImage);

...或者對於仍需要針對 Java 8 進行編譯的項目...

/**
 * Use reflection to attempt to set the taskbar icon using Java 9+
 */
public void setTaskbarIcon(Image image) {
    try {
        Class taskbar = Class.forName("java.awt.Taskbar");
        Method getTaskbar = taskbar.getDeclaredMethod("getTaskbar");
        Object instance = getTaskbar.invoke(taskbar);
        Method setIconImage = instance.getClass().getDeclaredMethod("setIconImage", Image.class);
        setIconImage.invoke(instance, image);
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

這仍然受到其他帖子中解釋的限制(例如啟動圖標不正確)以及不使用多維.icns文件的圖標分辨率的限制,但在許多情況下,這將比通用 Java 圖標更好。 :)

暫無
暫無

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

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