【问题标题】:Setting the default application icon image in Java swing on OS X在 OS X 上的 Java swing 中设置默认应用程序图标图像
【发布时间】:2016-09-03 09:51:58
【问题描述】:

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

【问题讨论】:

  • 图片在哪里?使用getResource()加载图片,即:getClass().getClassLoader().getResource("logo.png")
  • 执行此操作时出现同样的错误。
  • 确保getResource()返回的URL不为空。
  • 您正在尝试设置 Dock 图标?还是应用程序菜单栏图标?
  • 请编辑您的问题以包含这些要求。

标签: java macos swing imageicon


【解决方案1】:

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);
    }
}

【讨论】:

  • 谢谢,Application类在哪里下载?
  • +1 for com.apple.eawt.Application,我之前忽略了。
  • 谢谢!这解决了我的问题。附:我需要做:Application.getApplication().setDockIconImage(new ImageIcon(getClass().getResource("/logo.png")).getImage());
  • com.apple.eawt.Application.setDockIconImage 现在是一个死链接。关于 2015 年在哪里寻找这个的任何想法?
  • 在这里详细说明一下,在mac中,当你运行一个java应用程序时,似乎有两个“图标”在起作用。作为一个整体,java进程本身默认获取一个图标(java cpu),然后是您创建的新窗口,每个新窗口都有“它自己的图标”,在您最小化该窗口之前显然甚至不可见。所以要小心你设置了哪个图标,这个答案描述了如何影响“主”图标,它显然总是可见的。很奇怪。
【解决方案2】:

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

【讨论】:

  • @rogerdpack 当然这是一个选项,但是这个检查确保setDockIconImage() 可以安全地执行。
【解决方案3】:

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

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

一些相关细节提到here

【讨论】:

  • 有什么方法可以在不将其捆绑为 .app 的情况下实现这一点?我们选择在 Java 上开发这项技术,以便我们可以将一个文件分发给所有用户,而不管平台如何。
  • 您可以分发 JAR-with-manifest 或使用 java-web-start,但您会得到一个(不同的)通用图标。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    因为我已经解决了您的错误,它与升级到 10.7.4 后开始出现的 MacOS jdk 相关

    如果对您有帮助,请转至 this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-10
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多