用NetBeans开发基于Swing组件的软件界面时,少不了要使用图片,但时往往有许多程序员发现写完的程序,在NetBeans环境下编译,图片路径连接从来没有出现错误,但是在生成.jar包时就会出现错误。
源代码如下:
URL url = getClass().getClassLoader().getResource("icons/logo.gif");
label=new JLabel("",new ImageIcon(Toolkit.getDefaultToolkit().getImage(url)),JLabel.CENTER);
在NetBeans里运行没有问题
使用Build Jar打包后,把jar文件拿出来,总是出现如下错误:
Uncaught error fetching image:
JAVA.lang.NullPointerException
at sun.awt.image.URLImageSource.getConnection(Unknown Source)
at sun.awt.image.URLImageSource.getDecoder(Unknown Source)
at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
at sun.awt.image.ImageFetcher.run(Unknown Source)
在我开发的NFDTools软件里也同样出现了路径错误,很时郁闷。当然,如果在程序中使用绝对路径,那是没有问题的,但是这会带来很大的不便。历经艰难,我在网上找到以下处理方法,我自己亲身试验,果然有效,在此列出给大家参考。
出现这种问题的原因大多是因为路径的问题,往往是在项目中运行正常,但是一旦打包成Jar后就不能正常显示了,下面总结一下解决此类问题的方法:
image=new ImageIcon(SwingResourceManager.getImage ("icons/logo.gif"));就可以了。
ImageIcon image = new ImageIcon(this.class.getResource("icons/logo.gif"));
下面对这种方式详细说明:
问题解决:
1、你将所有资源打包为andy.jar,你的类位于一个包中:package andycpp;你的图片资源全部放在images文件夹中,而images文件夹也位于andycpp包内。这样的话,最终的路径表现为:
|__andycpp
|__ GUITest.class
|__ images
|__ Snap1.jpg
2、另一种情况,如果你的类有很多,并且包结构很复杂,那么你就不大可能把图片和类放在同一个层次上,而是应该把图片放到最外层,让所有的类通过绝对路径来访问该图片:
|__andycpp
|__ GUITest.class
|__ images
|__ Snap1.jpg
ImageIcon img1 = new ImageIcon(imgURL);