13

我正在尝试为 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
4

5 回答 5

30

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);
    }
}
于 2012-07-01T04:22:16.760 回答
9

只是为了添加我在纯 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()方法。对我来说效果很好,并且不会干扰其他平台。

于 2015-04-15T14:13:36.310 回答
6

您可以将.icns文件放在应用程序包的Contents/Resources目录中并在Info.plist文件中引用它。例如,一个名为的文件ApplicationName.icns将被<dict>以下形式的条目引用:

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

这里提到了一些相关的细节。

于 2012-06-29T00:32:46.877 回答
3

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

于 2016-08-03T02:05:26.123 回答
1

正如我经历了你的错误,它与升级到 10.7.4 后开始出现的 MacOS jdk 相关

如果这对您有帮助,请通过此操作:

于 2012-07-01T17:47:27.177 回答