我把程序打成jar文件后,程序里要把jar包里的图片显示在界面上,但是使用当前路径的话,得到却是运行jar文件的路径,
如:d:\myworks\java -jar XXX.jar,得到的当前路径是 d:\myworks。
我想要的效果如同示例 %JAVA_HOME%\demo\jfc\Notepad,运行时能够在界面上显示resources文件里的图片。
该怎么做呢?怎样处理这个路径问题?需要用到配置文件么?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【scorpionqxq】截止到2008-08-03 21:07:09的历史汇总数据(不包括此帖):
    发帖的总数量:11                       发帖的总分数:180                      每贴平均分数:16                       
    回帖的总数量:52                       得分贴总数量:19                       回帖的得分率:36%                      
    结贴的总数量:10                       结贴的总分数:130                      
    无满意结贴数:4                        无满意结贴分:70                       
    未结的帖子数:1                        未结的总分数:50                       
    结贴的百分比:90.91 %               结分的百分比:72.22 %                  
    无满意结贴率:40.00 %               无满意结分率:53.85 %                  
    值得尊敬

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=scorpionqxq
      

  2.   

    使用相对路径吧,如使用eclipse,在你项目下建个image,然后把图片copy到这文件夹,然后使用/image/123.jpg来使用它。。
    在你读这图片的时候就用相对路径,然后打包,就应该好了。
      

  3.   

    1 你的资源文件也在jar里面吗? 如果在,请看这里。。http://www.java2000.net/p1602 如果在当前目录,和jar在一起,那你就用相对路径直接读取就行了,你管他放到c:还是d:
      

  4.   

    当前类名.class.getClassLoader().getResource("资源的相对路径");
      

  5.   

    可利用swt中的一个获取图片的类SwingResourceManager 来解决, 具体代码如下
    import java.awt.Image; 
    import java.awt.Toolkit; 
    import java.io.BufferedInputStream; 
    import java.io.ByteArrayOutputStream; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.util.HashMap; 
    import java.util.Iterator; 
    import javax.swing.ImageIcon; public class SwingResourceManager { private static HashMap <String, Image> m_ClassImageMap = new HashMap <String, Image>(); private static Image getImage(InputStream is) { 
    try { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte buf[] = new byte[1024 * 4]; 
    while (true) { 
    int n = is.read(buf); 
    if (n == -1) 
    break; 
    baos.write(buf, 0, n); 

    baos.close(); 
    return Toolkit.getDefaultToolkit().createImage(baos.toByteArray()); 
    } catch (Throwable e) { 
    return null; 

    } public static Image getImage(Class clazz, String path) { 
    String key = clazz.getName() + ' ¦' + path; 
    Image image = m_ClassImageMap.get(key); 
    if (image == null) { 
    if ((path.length() > 0) && (path.charAt(0) == '/')) { 
    String newPath = path.substring(1, path.length()); 
    image = getImage(new BufferedInputStream(clazz.getClassLoader().getResourceAsStream(newPath))); 
    } else { 
    image = getImage(clazz.getResourceAsStream(path)); 

    m_ClassImageMap.put(key, image); 

    return image; 

    public static Image getImage(String path) { 
    return getImage("default", path); //$NON-NLS-1$ 

    public static Image getImage(String section, String path) { 
    String key = section + ' ¦' + SwingResourceManager.class.getName() + ' ¦' + path; 
    Image image = m_ClassImageMap.get(key); 
    if (image == null) { 
    try { 
    FileInputStream fis = new FileInputStream(path); 
    image = getImage(fis); 
    m_ClassImageMap.put(key, image); 
    fis.close(); 
    } catch (IOException e) { 
    return null; 


    return image; 
    } public static void clearImages(String section) { 
    for (Iterator I = m_ClassImageMap.keySet().iterator(); I.hasNext();) { 
    String key = (String) I.next(); 
    if (!key.startsWith(section + ' ¦')) 
    continue; 
    Image image = m_ClassImageMap.get(key); 
    image.flush(); 
    I.remove(); 


    public static ImageIcon getIcon(Class clazz, String path) { 
    return getIcon(getImage(clazz, path)); 

    public static ImageIcon getIcon(String path) { 
    return getIcon("default", path); //$NON-NLS-1$ 
    } public static ImageIcon getIcon(String section, String path) { 
    return getIcon(getImage(section, path)); 

    public static ImageIcon getIcon(Image image) { 
    if (image == null) 
    return null; 
    return new ImageIcon(image); 

    } 将该类放在你的项目中,使用方法 
    lable对象.setIcon(SwingResourceManager.getIcon(label所在类的类名.class, 
    "图片所在相对与类路径")); 
    如你的图片icon.jpg在与你程序根目录namespace在同一根目录下的image文件夹中,则路径应写为/image/icon.jpg
      

  6.   

    还是搞不定啊。现在就做了个很简单的测试读文件内容。
    Test.java 和 aa.txt文件在同一根目录下 URL fileUrl = Test.class.getClassLoader().getResource("aa.txt");
    File file = new File(fileUrl.getFile());
    BufferedReader read = new BufferedReader(new FileReader(file));
    System.out.println(read.readLine());
    read.close();test.jar目录如下:
      + META-INF
      |- aa.txt
      |- Test.class
    错误为:
    Exception in thread "main" java.io.FileNotFoundException: file:\C:\Documents%20a
    nd%20Settings\Administrator\%e6%a1%8c%e9%9d%a2\test.jar!\aa.txt (文件名、目录名
    或卷标语法不正确。)
            at java.io.FileInputStream.open(Native Method)
            at java.io.FileInputStream.<init>(FileInputStream.java:106)
            at java.io.FileReader.<init>(FileReader.java:55)
            at Test.main(Test.java:10)why????
      

  7.   

    楼上不是有人说过了吗?必须用ClassLoader.getResourceAsStream()接口来得到输入流,
      

  8.   

    恩恩,我又试了试,的确。总结一哈:
    如果用getResource() 能够得到一个URL,从而可以转成File取得aa.txt,但是再使用FileReader的话,就会有9楼的问题。
    如果用getResourceAsStream() 得到一个InputStream,就可以得到aa.txt的内容了。但是现在的需求是,
    要得到jar包里的resource目录下的所有.txt文件,然后再对它们 read 。how to do?试了哈,如果getResource()参数是文件的相对路径,可以转成File,但如果参数是想对的目录的话,
    File f = new File(url.getFile()); 会说这句话有空指针异常。why?
      

  9.   

    4楼正确,打包之后,要用getClassLoader().getResource("资源的相对路径");来获得资源的!
      

  10.   

    还是没有理解我的意思,也许我说的不清楚。如果用 getResourceAsStream() 得到文件的 InputStream ,就得要知道每个文件的绝对路径才行。我的需求是:给 getResource() 传的参数是一个 resource 的目录路径,然后通过类似于 File.list() 之类的方法得到 resource 目录下的所有 .txt 的路径,然后对其 read。