3

我正在eclipse中开发一个java项目。为了分发程序,我通过 eclipse 中的导出功能创建了一个可运行的 .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;
         }

}

非常感谢您的帮助!

4

3 回答 3

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);
于 2012-05-12T22:05:36.217 回答
2

假设该文件确实在 .jar 包中,原因很可能是 .jar 文件中的条目以区分大小写的方式加载,因此与.jarfoo.png文件不同Foo.png。当您从常规文件加载时,行为取决于 Windows 和 Mac 上的文件系统,foo.png并且Foo.png将表示相同的文件(!)。

于 2012-05-12T22:01:05.107 回答
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 之外,所以我确定。

于 2012-05-12T22:19:47.530 回答