【问题标题】:Images in runnable jar are not working - NullPointer is thrown可运行 jar 中的图像不起作用 - 抛出 NullPointer
【发布时间】:2013-03-02 21:48:27
【问题描述】:

我在整个网站上都看到过这个问题。我已经阅读了几乎所有的回复。我觉得我正在做需要做的事情,但我就是无法让它发挥作用!我正在尝试将一些图像打包到一个 Runnable Jar 中,以便我的程序是独立的。当我在 Eclipse 中运行代码时,它按预期工作。但是当我使用可执行 Jar 时,程序不会启动。它在我创建图像的行上给了我一个 NullPointerException。这些文件位于项目源文件夹中名为 Resources 的文件夹中。这是代码。它是不完整的,因为这只是我一直在尝试的一个测试程序。

import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class testgui extends JFrame{
private static JLabel label = new JLabel();
private static testgui gui = new testgui();
private static ArrayList<ImageIcon> sprites;

public static void main(String[] args) {

    // TODO Auto-generated method stub
    sprites = getImages();
    BufferedImage backgroundImage;
    try {
        backgroundImage = ImageIO.read(new testgui().getClass().getClassLoader().getResource("resources/runescapemap.png"));
        gui.setContentPane(gui.new ImagePanel(backgroundImage));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    gui.setLayout(new GridLayout(1,2));
    label.setIcon(sprites.get(0));
    gui.add(label);
    gui.setSize(1000,900);
    gui.setVisible(true);
}

private static ArrayList<ImageIcon> getImages(){
    ImageIcon autoTalkerLogo = new ImageIcon(new testgui().getClass().getClassLoader().getResource("Resources/autotalker-logo.png"));
    ImageIcon meterNormal = new ImageIcon(new testgui().getClass().getClassLoader().getResource("Resources/meter.png"));
    ImageIcon meterSafe = new ImageIcon(new testgui().getClass().getClassLoader().getResource("Resources/meter-safe.png"));
    ImageIcon meterNotSafe = new ImageIcon(new         testgui().getClass().getClassLoader().getResource("Resources/meter-notsafe.png"));
    ArrayList<ImageIcon> sprites = new ArrayList<ImageIcon>();
    sprites.add(autoTalkerLogo);
    sprites.add(meterNormal);
    sprites.add(meterSafe);
    sprites.add(meterNotSafe);
    return sprites;
}

class ImagePanel extends JComponent {
    private Image backgroundImage;
    public ImagePanel(Image image) {
        this.backgroundImage = image;
    }
    @Override
    protected void paintComponent(Graphics g) {
        g.drawImage(backgroundImage, 0, 0, null);
    }
}
}

【问题讨论】:

    标签: image jar executable


    【解决方案1】:

    如果该文件夹真正称为Resources 而不是resources,则可能是问题所在。虽然 Windows 文件系统不区分大小写,但 jar 文件不区分大小写。

    试试

    ...getResource("Resources/runescapemap.png")
    

    我注意到你以后对getResource的调用使用Resources而不是resources

    当然,也可以反过来——也许你的文件夹实际上是resources,这是第一个调用没关系,其他四个应该使用resources。无论哪种方式,两者都不太可能是正确的......

    【讨论】:

    • 你是对的! “资源”中的“r”需要大写。我的大小写不一致的原因是因为我试图改变事情以使其正常工作。我一定是因为我的改变而产生了一些反复无常。
    猜你喜欢
    • 1970-01-01
    • 2013-07-06
    • 2015-12-21
    • 2020-10-29
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 2021-02-18
    相关资源
    最近更新 更多