原文:《Java ImageIcon 不能显示问题》  作者:在外漂流的孩子

      Java程序ImageIcon无法显示图片时,可能有以下几种原因:
      使用ImageIcon控件
一:在JDK 1.6中,如果java源文件没有使用包,那么可以直接通过相对路径(相对当前类的路径)获取图片
      例如 ImageIcon image= new ImageIcon("ship.png");
      其中ship.png和这句引用所在的类在同一目录下。
二:在Netbeans中,在默认文档框架下,如果Java源文件使用了包,那么可以通过loader资源获取函数获取图片
      例如 包头:package guardeva;
      控件: ImageIcon image= new ImageIcon(ClassLoader.getSystemResource("guardeva/ship.png"));
      这种情况下,用classloader的获取函数得到的地址是包地址作为起始。
      另外,不论是否含有包,都可以用完整工程路径获取图片,例如
      ImageIcon image= new ImageIcon("src/guardeva/ship.png");
     使用Eclipse等其它开发环境可能会有所不同。
三:如果是在Applet程序中
      直接用new ImageIcon("img.jpg")无法显示图片; 要改为new ImageIcon(getImage(getCodeBase(),"img.jpg"));图片才能显示出来。
      这是由于Applet小引用程序是运行在WEB中的,没有绝对地址,所以只能用相对路径来加入图片,Applet本身不知道调用自己的网页所在的路径地址,所以用getCodeBase()来获得网页所处的位置。Applet中getImage()方法有两个构造,一个是(URL),一个是(URL,String name),我们利用第二个构造就可以返回一个指定的图片对象了,把这个图片对象加入到new ImageIcon()中就可以在Applet中显示出图片。


原文:《ImageIcon图标文件相对路径研究总结》  作者:anakinlu

一、问题
      ImageIcon icon = new ImageIcon("a.gif");
      执行结果是icon无法显示
 
二、解决
      类中有如下调用:
      ImageIcon icon = new ImageIcon("a.gif");
      很自然地认为当前类文件和图片在同一路径下即可。其实所谓的相对路径起点是工程的根目录,即project。这行代码执行时在project目录下查找名为a.gif的文件,结果当然是找不到。要得到工程的相对路径可通过System.getProperty("user.dir")得到。对图片和对文件的查找应该是一致的,如new File()。假如你的工程根目录为:project1,你的图片文件放在:project1/src/images/a.gif
      所以正确的调用是:ImageIcon icon = new ImageIcon("src//images//a.gif");
      这行代码执行时在project/test目录下查找到了文件
      总结起来就是一句话:所谓相对路径就是相对于工程根目录的位置^_^
 
三、其他
      查看了一下ImageIcon的构造函数。
      Public ImageIcon(String filename)//参数可以是绝对路径也可以是相对路径
      Public ImageIcon(URL url)
      第一种构造不在赘述。
      第二种通过URL来得到图片
      URL url = getClass().getResource("a.gif"); //当前编译后class文件所在目录查找
      ImageIcon icon = new ImageIcon(url);
 
      ImageIcon支持GIF、JPG、PNG等格式。


      另外,还找到了其他的一些获取资源的路径的方法:

      获取.class文件的URL目录……/bin/……/……/:XX.Class.getResource("filename");

……/bin/:XX.Class.getResource("/filename");

XX.Class.getClassLoader.getResource("/filename");

                                                                      ClassLoader.getSystemResource("filename");

                                                                      ClassLoader.findResource("filename");

                                                                      Thread.currentThread().getContextClassLoader.getResource("");

       但是以上几种方法的使用条件和具体使用效果还有待探索。