在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