java - 如何从 jar 文件中加载图像?

标签 java image jar embedded-resource japplet

我有一个简单的游戏,它作为 JApplet 运行。当我在 Eclipse 中测试它时,它运行得很好。但是,当我将其导出为小程序并尝试在浏览器中测试它时,它找不到图像。 jar文件内的文件夹结构如下:

index.html (page that displays the applet)  
shipyard.jar  
_shipyard  
__Shipyard.class (main applet class)  
_img  
__All of my images, saved as .png files  

用于显示小程序的 HTML 代码如下:

<object width="1280" height="720" data="shipyard.jar" type="application/x-java-applet">
    <param name="archive" value="shipyard.jar">
    <param name="code" value="shipyard.Shipyard">
    <param name="align" value="middle">
</object>

我的 init() 和 run() 方法,它们设置预加载队列,然后迭代它以检索和准备图像:

@Override
public void init(){ 
    markImageForPreload("background");
    markImageForPreload("shipyard_interior");
    markImageForPreload("tooltip");
    markImageForPreload("button");
    for(String s : ShipyardExterior.tilePages) markImageForPreload("tiles/" + s);
    for(ShipSystem sys : ShipSystem.allSystems){
        markImageForPreload("system/interior/" + sys.imgName);
        if(sys.getForceExterior()) markImageForPreload("system/exterior/" + sys.imgName);
    }   
    for(ShipWeapon wep : ShipWeapon.allWeapons){
        markImageForPreload("weapon/" + wep.imgname);
    }

    currentScreen = new LoadingScreen();

    addMouseListener(this);
    addKeyListener(this);
}

@Override
public void run() {

    preloadCount = 0;       
    preloadTotal = preloadQueue.size();

    for(String s : preloadQueue){
        this.prepareImage(getOrLoadImage(s), this);
        preloadCount++;
        repaint();
    }              

    currentScreen = new ShipyardInterior();

    while(true){
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        try {
            if(this.getMousePosition() != null){
                mouseX = this.getMousePosition().x / 2;
                mouseY = this.getMousePosition().y / 2;
            }
        } catch (NullPointerException e){}
        currentScreen.onUpdate();
        repaint();
        try {
            Thread.sleep(1000 / 60);
        } catch(InterruptedException e) {}

        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    }
}

JApplet 类中加载和检索图像的方法:

public static Image getOrLoadImage(String s){
    Image img = instance.loadedImages.get(s);
    if(img == null){
        System.out.println("Loading " + s + ".png.");
        try {
            img = ImageIO.read(new URL(instance.getCodeBase(), "../img/" + s + ".png"));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if(img == null) System.out.println("Image does not exist.");
        else instance.loadedImages.put(s, img);
    }
    return img;
}

“loadedImages”是一个静态 HashMap,通过 URL 存储图像。调用该方法时,它首先检查图像是否已加载。如果是,则返回图像。如果未加载,则会加载它并将其 Image 实例添加到 returnedImages 中。

当我打开页面时,小程序运行,但图像不显示。像drawString()、drawRect()和其他基本渲染方法这样的方法可以工作,但图像不行。

我在互联网上搜寻过,但找不到任何关于该主题的有用信息。一个线程告诉我对小程序 jar 进行自签名,我照做了,但这似乎不起作用。我尝试过各种检索图像的方法(包括 getClass().getClassLoader().getRescource())、设置代码库等,但无济于事。有什么建议吗?

最佳答案

img = ImageIO.read(new URL(instance.getCodeBase(), "../img/" + s + ".png"));

如果我有时间,很高兴听到您关于为什么这适用于所描述的结构的推理。 AFAIU 应该是:

img = ImageIO.read(this.getClass().getResource("/img/" + s + ".png"));

关于java - 如何从 jar 文件中加载图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18564020/

相关文章:

javascript - 将(非 Base64)文本字符串转换为 Base64 图像

ios - 在 iOS 中使用元数据保存 RGBA 图像

java - 从运行的应用程序中恢复Jar

scala - 如何从scala制作一个jar文件

jar 文件中的 Java 类加载器

java - APIGatewayV2HTTPEvent、APIGatewayProxyRequestEvent 和 APIGatewayV2ProxyRequestEvent 之间的区别

java - 算法复杂度 : Finding the starting index of a sub array in a larger array

java - TextureAtlas 区域到 Texture

java - 图像的 JLabel

java - Swing 事件麻烦