从 Jar 中的资源文件夹中引用图片

Referencing Pictures from resource folder in a Jar

我无能为力,但我想我只是错过了回答我问题的线程,但我已经找了很长时间了,似乎找不到我需要的帮助。

我的问题很简单: 我已经创建了一个游戏(或者更确切地说我正在制作它)并且我正在尝试向其中添加精灵(敌人等的 png 文件)。将它们加载到 IDE 中工作正常,但是当我创建一个 jar 文件并尝试打开它时,它只是显示 "A Java Exception has occurred"。进一步调查发现问题是它找不到我告诉它加载的文件。

通过我阅读的线程,我收集了这么多: 要么是我没有正确加载图像,这意味着我没有使用正确的代码,要么 我的 MANIFEST.mf 不包含 "Class-Path" (这意味着参数是空白的,实际上它们是)

我找不到其他代码。人们建议使用我无法正常工作的 ClassLoader。试用它给了我空指针异常。

试图研究后者并没有太大帮助,因为我找不到任何帮助信息,或者我只是什么都不明白。

package platformer.resources;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.*;

public class ImageLoader 
{
    static String spritePath = "src/platformer/resources/";

    public static BufferedImage loadImage(String path)
    {
        BufferedImage img = null;

        try{img= ImageIO.read(new File(spritePath+path));
        }catch(IOException e){System.out.println("Couldn't load File: "+spritePath+path);}

        return img;
    }

    public static BufferedImage flipImage(BufferedImage bufferedImage)
    {
        AffineTransform tx = AffineTransform.getScaleInstance(-1, 1);
        tx.translate(-bufferedImage.getWidth(null), 0);
        AffineTransformOp op = new AffineTransformOp(tx,
        AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
        bufferedImage = op.filter(bufferedImage, null);

        return bufferedImage;
    }
}

这是我目前使用的代码。 其他 classes 会使用 "loadImage" 或 "flipImage" 并且在 IDE 中它工作正常但是作为 .jar 它无法找到 .png.

例如 class "platformer/entities/walker.class" 会尝试打开 "Idle.png"。为此,它使用 "loadImage("/entities/enemy/walker/Idle.png")" 方法。请注意,在该方法中,实际路径最终将成为 "src/platformer/resources/entities/enemy/walker/Idle.png".

再次,如果这个问题已经得到解答,我深感抱歉,但我仍然感谢您的帮助。

迈克尔

当您的文件在 jar 中时,它们只能作为资源流取出,因此您需要使用类似的东西: ImageLoader.class.getResourceAsStream("nameoffile"). 这是因为 jar 实际上是一个压缩的目录结构,而文件并不是真正的文件,它们隐藏在压缩的 zip 格式中作为二进制文件。