我正在eclipse中开发一个java项目。为了分发程序,我通过eclipse中的export-function创建了一个可运行的.jar文件。
在我的程序中,加载了几个存储在名为“tableImages”的文件夹中的图像。我通过ClassLoader加载图像(你会在下面找到代码片段)。问题如下:从.jar文件执行程序时,在上面提到的文件夹中加载一个.png文件时会抛出NullPointerException。现在有趣的是,完全相同的文件夹中的一些.png文件被正确加载,这意味着它们不会导致NullPointerException。
我使用jar tf命令检查了.jar的内容。显然无法加载的图像被装入罐子里。那么是什么导致了这个NullPointerException以及如何解决呢?
这是我用摆动框架绘制图像的类。
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import java.net.*;
public class LoadBackgroundImage extends Component {
private static final long serialVersionUID = 1L;
BufferedImage img;
public void paint(Graphics g){
g.drawImage(img, 0, 0, null);
}
public LoadBackgroundImage(String image){
URL url = ClassLoader.getSystemResource(image);
try{
img = ImageIO.read(url);
this.setSize(img.getWidth(), img.getHeight());
}catch(IOException e){
System.err.println(e.getMessage());
}
}
public Dimension getPreferredSize(){
if(img == null){
return new Dimension(100, 100);
}else{
return new Dimension(img.getWidth(null), img.getHeight(null));
}
}
public BufferedImage getImage(){
return img;
}
}
非常感谢你的帮助!
答案 0 :(得分:3)
URL url = ClassLoader.getSystemResource(image);
此URL转换为文件系统中的绝对路径,该路径将是jar中文件的无效路径。例如,如果bar.jar下有一个名为foo.png的文件,则URL为/path_to_current_dir/bar.jar/!foo.png无效。相反,您可以将文件作为流读取:
InputStream is = getClass().getClassLoader().getResourceAsStream(image);
ImageIO.read(is);
答案 1 :(得分:2)
假设文件确实在.jar包中,原因很可能是.jar文件中的条目是在区分大小写的情况下加载的,因此foo.png
不是与Foo.png
相同。从常规文件加载时,行为取决于文件系统,因此在Windows和Mac上foo.png
和Foo.png
将表示相同的文件(!)。
答案 2 :(得分:2)
你可以使用一个URL,我只是自己尝试过,它运行得很好,从jar中获取png文件:
这是我使用的代码:
public static ImageIcon getIcon(String path)
{
String imageFile = "";
if(path.equals(""))
imageFile = "/Images/Icon.png";
else
imageFile = path;
URL source = Messages.class.getResource(imageFile);
if(source != null)
{
ImageIcon imageIcon = new ImageIcon(source);
return imageIcon;
}
return null;
}
然后我将它直接添加到JLabel,像魅力一样工作,我还移动了jar文件并将jar文件重命名为jar,所以我确定。