为什么我的BufferedImage不会显示在.jar文件中?

时间:2012-10-02 13:55:04

标签: java jar jlabel bufferedimage

好吧,所以我创建了一个在JLabel上显示的缓冲图像。当我显示文件位置时,它需要在我想要访问的文件夹前面的src /,否则会出现错误,我不会看到缓冲图像......我知道如果我把'src /'在resImg之前,BufferedImage不会显示在IDE之外。有人可以帮忙吗? 这是在IDE内部运行的代码。从.jar文件向外部运行时,图像不会显示。

static File f = new File("src/resImg/banner.png");

try {
        banner = ImageIO.read(f);
        picLabel = new JLabel(new ImageIcon(banner));
        LabelPanel.add(picLabel);
    } catch (IOException ex) {
        Logger.getLogger(GameStart.class.getName()).log(Level.SEVERE, null, ex);
    }

5 个答案:

答案 0 :(得分:2)

当资源位于jar文件中时,它不是本地文件系统上的文件。你应该使用

URL imageSource = getClass().getResource("/resImg/banner.png");
if (imageSource == null) {
    // Handle the resource being missing
}
picLabel = new JLabel(new ImageIcon(imageSource));

这里你从类加载器中获取资源,显然可以访问jar文件中的文件。

答案 1 :(得分:1)

如果你想从jar获取图像,请使用这样的smth:

URL imageurl = getClass().getResource("/images/imagename");

答案 2 :(得分:1)

您无法在JAR文件中为资源创建File对象。请改用它。

URL imgurl = this.getClass().getClassLoader().getResource("resImg/banner.png");
picLabel - new JLabel(new ImageIcon(imgurl));

希望这有帮助。

答案 3 :(得分:1)

您必须找到父目录,相对路径可以从

开始
  • 工作区目录
  • 进程启动的目录

相对路径是从java进程开始的“realtiv”,因此路径可能会不时发生变化。

如果图片放在广口瓶中,您可以使用

getClass().getResource("relativ jar path")

用于查找图像。罐子本身就知道它放在哪里。

答案 4 :(得分:0)

最可能的原因是你的图像没有打包在jar文件中(用jar / zip工具验证)。

如果图像在那里但没有显示,那是因为你试图从文件系统相对于工作目录读取它(当然不存在)

因此,正确的解决方案是从类路径中读取图像:

Thread.currentThread().getContextClassloader().getResourceAsStream(... path to your image relative to jar root ---)