在 OS X 上的 Java Swing 中设置默认应用程序图标图像

2022-09-03 16:39:01

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

答案 1

setIconImage 不设置 jar 图标。它将为最小化窗口的外观设置图标。jar 图标(控制查找器图标和停靠应用程序图标)不能在 jar 文件本身中设置。您只需获得操作系统提供的默认图标即可。您需要使用JarBundler for OS X或Launch4J for Windows之类的东西来包装它。JFrame

您可以在应用程序运行时设置应用程序停靠图标,请参阅 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);
    }
}

答案 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()