我不是用JB的,但也碰到类似情况,
我解决的方法是将它放在classpath里,
运行时System.getProperty("java.class.path");得到所有classpath,
然后用System.getProperty("path.separator")作StringTokenizer,
分解所有classpath,并依次在里面查找是否存在String paths=System.getProperty("java.class.path");
String pathSeparator=System.getProperty("path.separator");
StringTokenizer tk=new StringTokenizer(paths,pathSeparator);
do{
   String currentPath=tk.nextToken();
   //Search in currentPath;
}while(tk.hasMoreTokens() && whatYouNeedStillNotFound);

解决方案 »

  1.   

    如果你用的是ImageIcon,可以用getIconWidth()==-1来判断是否找到该gif
      

  2.   

    maybe should modified: ../../
      

  3.   

    or deleted ../ you may try
      

  4.   

    CSDN - 专家门诊 - Java J2SE / 基础类问题  
     回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 保存 | 关闭窗口   
     
     
    主  题:  相对路径不起作用???? 
    作  者:  Rock_Guan (Rock)  
    等  级:    
    信 誉 值:  100 
    所属论坛:  Java J2SE / 基础类 
    问题点数:  100 
    回复次数:  6 
    发表时间:  2003-2-22 15:03:04 
       
     
       我用如下代码获取图片路径,
    URL url = this.getClass().getResource("../image/user.gif");
    Toolkit tk = Toolkit.getDefaultToolkit();
    this.setIconImage(tk.createImage(url));在JBUilder内运行一切正常,但是用JBuilder生成exe程序后,在jubilder外运行exe程序,程序报错
    java.lang.NullPointerException
    at com.borland.jbcl.util.ImageLoader.load(ImageLoader.java:83)    
    看来是图片路径不对,
    ClassLoader.getSystemResource("../image/emis.gif");的获取方式也试过了,都是不行,请高手指点搞定马上结贴
      
     
     
     回复人: shine333(shine) ( ) 信誉:100  2003-2-22 15:35:49  得分:0 
     
     
      
    我不是用JB的,但也碰到类似情况,
    我解决的方法是将它放在classpath里,
    运行时System.getProperty("java.class.path");得到所有classpath,
    然后用System.getProperty("path.separator")作StringTokenizer,
    分解所有classpath,并依次在里面查找是否存在String paths=System.getProperty("java.class.path");
    String pathSeparator=System.getProperty("path.separator");
    StringTokenizer tk=new StringTokenizer(paths,pathSeparator);
    do{
       String currentPath=tk.nextToken();
       //Search in currentPath;
    }while(tk.hasMoreTokens() && whatYouNeedStillNotFound);  
     
    Top 
     
      

  5.   

    先谢过shine333(shine) 再次发言,但是我希望图片文件都打包在同一个jar文件中,不需要在外部读取,因为不小心删除图片就没法显示了。
      

  6.   

    对呀,我把他们放在classpath,就是为了可以把jar也用上啊!
    class include .jar file
      

  7.   

    要使用相当路径
    以下例子我做了测试,希望对你有帮助。a、文件路径如下:
    f:\java\testjar.java
    f:\java\MANIFEST.MF
    f:\java\citi\sonnet.xml1、源文件
    //:testjar.java
    package citi;
    import java.io.*;
    public class testjar{
      public static void main(String[] args){
        try{
          BufferedReader in;
          String str;
          //由于文件sonnet.xml要打入包中,故文件应该在包路径“citi”中
          //使用时,需要使用相对路径来引用,如下面的".\\citi\\sonnet.xml"
          in = new BufferedReader(new FileReader(".\\citi\\sonnet.xml"));     
         while((str = in.readLine())!= null){
          System.out.println(str);
         }
         in.close();
        }catch(Exception e){e.printStackTrace();}
      }
    }2、文件sonnet.xml内容
    <?xml version="1.0"?>
    <sonnet type="Shakespearean">
      <author>tsc</author>
    </sonnet>3、文件MANIFEST.MF内容
    Manifest-Version: 1.0
    Main-Class: citi.testjar
    Created-By: tangshancheng4、操作步骤实例F:\java>javac testjar.java -d .F:\java>jar cvfm my.jar manifest.mf citi
    标明清单(manifest)
    增加:citi/(读入= 0) (写出= 0)(存储了 0%)
    增加:citi/testjar.class(读入= 707) (写出= 464)(压缩了 34%)
    增加:citi/sonnet.dtd(读入= 1165) (写出= 361)(压缩了 69%)
    增加:citi/sonnet.xml(读入= 91) (写出= 80)(压缩了 12%)F:\java>java -jar my.jar
    <?xml version="1.0"?>
    <sonnet type="Shakespearean">
      <author>tsc</author>
    </sonnet>
      

  8.   

    to tangshancheng(98007) ,你在F:\java 目录下执行java  -jar  my.jar 能够打印信息出来是因为F:\java下存在 citi\sonnet.xml的目录结构,程序读取的是jar包外部的citi\sonnet.xml文件而不是jar包内的sonnet.xml文件,你把citi\sonnet.xml删除看能否读出内容。我试过好像不行
      

  9.   

    to tangshancheng(98007) ,我刚试过把citi目录改名了,程序马上不能运行
    java.io.FileNotFoundException: .\citi\sonnet.xml (系统找不到指定的路径。)
    所以程序读取的是外部的sonnet.xml 而不是包内的