在OS X上以Java swing设置默认应用程序图标图像

我正在尝试为Jar文件设置图标图像:

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

在Mac OS X 10.7.4中运行时出现以下错误:

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

setIconImage不设置jar图标。 它将为该JFrame的最小化窗口设置图标。 jar图标(控制finder图标和dock应用程序图标)无法在jar文件中设置。 您只需获取操作系统提供的默认图标。 您需要使用JarBundler for OS X或Launch4J for Windows等包装它。

您可以在应用程序运行时设置应用程序停靠图标,请参阅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的文件将由此表单的条目引用:

 CFBundleIconFile ApplicationName.icns 

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

因为我已经完成了你的错误,它与MacOS jdk有关,它在升级到10.7.4后开始出现

如果这有助于你,请通过这个 :

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