2011-01-13 73 views
1

我目前正在编写一个程序,我需要以罐子形式发送给朋友。该程序有图像,需要加载程序才能正常工作,我希望它被包含在一个jar中。目前它不能从可执行jar或我通过命令行运行。它在netbeans中工作。我的jar文件不会加载图像

下面是我使用的代码:

要加载我使用的图像:

protected ImageIcon createImageIcon(String path, String description) 
{ 
java.net.URL imgURL = getClass().getClassLoader().getResource(path); 
if (imgURL != null) 
{ 
    return new ImageIcon(Toolkit.getDefaultToolkit() 
        .getImage(imgURL),description); 
} 
else 
{ 
    System.err.println("Couldn't find file: " + path); 
    return null; 
} 
} 

对我也尝试了

getClass().getResource(path) 

行的网址图像应该创建的位置是:

this.img =createImageIcon(File.separator+"."+File.separator 
      +"resources"+File.separator+"tiles"+File.separator+"tile.png","tile"); 

我的jar文件是在包含类文件和资源文件夹的文件夹的顶层设置的。

我已经搜索了解决这个问题的方法,但我找不到任何可行的方法。

感谢。

+0

在您的“createImageIcon”功能,您在图像将被创建的文件名传递?因为如果是这种情况,它意味着文件正被保存到/./resources/tiles/tile.png“,这相当于”/resources/tiles/tile.png“,它将位于文件系统的根目录。在这种情况下,一旦部署它,它就不会被你的类路径找到。 – 2011-01-13 00:40:07

回答

2

您的网址将评估为"/./resources/tiles/tile.png"这是没有意义的(但也许,当你从NetBeans中运行时使用的ClassLoader容忍的错误。)
尝试下探初始"/./"。您也不需要参考File.separator,因为该字符串被视为相对URL,并且正斜杠始终有效。

0

不管别的什么,你的代码具有失败缓慢的不可撼动性。

尝试像

URL x = get class.getclassloader.getresource(...) 
If x == null 
    Throw new defect "expected ... But it wasn't there" 

很抱歉的格式,但iPad使得它太难做是正确的。

1

而不是使用/./resources/back_img.png,使用resources/back_img.pngClassLoader
这里是例子:

String path = "resources/back_img.png"; 
    ClassLoader cl = ImageHandler.class.getClassLoader(); 
    URL imgURL = cl.getResource(path); 
    //URL imgURL = ImageHandler.class.getResource(path); 

    if (imgURL != null) { 
     ImageIcon icon = new ImageIcon(imgURL, description); 
     Image img = icon.getImage(); 
     Image sizedImg = img.getScaledInstance(width, height, Image.SCALE_DEFAULT); 
     return new ImageIcon(sizedImg); 
    } else { 
     System.err.println("Couldn't find file: " + path); 
     return null; 
    }