做出java程序后通常需要制作成jar文件,这时原有程序中带有的图片、音乐等资源可能没有正确导入,导致jar文件运行时没有图片甚至无法运行。
本文简单介绍下如何在运行jar文件时也能够显示出程序原有的图片,音乐等资源。
首先可以使用eclipse和netbeans或者其它编程软件来打包jar文件,个人认为netbeans做GUI时会省事不少,在打包jar文件时也非常简单,但在编程手感上还是更喜欢eclipse。
切入正题,
netbeans打包jar时只需点击如图所示的锤子即可,jar文件自动保存在所在项目目录下的dist里面。
如果你的程序包含了图片音乐等资源,那么你可能是这样写的。
setIcon(new ImageIcon("Image\\0.png"));
这样在运行jar文件时是无法显示图片的,因为找不到图片位置。
第一种解决方法是把图片和音乐粘到当前目录下即可,如图。
这时在运行程序就可以正确找到位置了,其中lib是加载的第三方jar包,打包jar文件时会自动添加。
仔细观察会发现,其实在打包的jar文件(用压缩软件打开)里已经包含了所有需要的图片和音乐,只是由于没有找到正确的位置所以无法显示。
所以,第二种解决方法是直接把图片等放到jar文件中去,这时需要修改调用图片的方式。
修改为如下形式。
setIcon(new ImageIcon(getClass().getResource("/0.png")));
注意斜杠的方向,实际上就是绝对路径,两种方法都能实现,但是实际上调用的图片是两个不同的路径。
实际上是调用了Class.getResource()方法,返回结果为url类型。
如果不明白可以输出一下看看。
System.out.println(getClass().getResource("")); //file:/C:/NetBeansProjects/Snow/build/classes/snow/
System.out.println(getClass().getResource("/")); //file:/C:/NetBeansProjects/Snow/build/classes/
System.out.println(getClass().getResource("xxx.class")); //file:/C:/NetBeansProjects/Snow/build/classes/snow/xxx.class
System.out.println(getClass().getResource("/xxx.class")); //null
第一句,输出存放该程序的所有class文件的目录。
第二句,会输出classpath的根目录。
第三句,会输出xxx.class所在目录。
第四句,xxx.class不在classpath根目录下,所以会输出null。