我在这个网站上看到过这个问题。我几乎读过每一个回复。我觉得我正在做的正是所需要的,但我无法让它发挥作用!我正在尝试将一些图像打包到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);
}
}
}
答案 0 :(得分:1)
如果文件夹名为Resources
而不是resources
,则可能是问题所在。虽然Windows文件系统不区分大小写,但jar文件不是。
尝试
...getResource("Resources/runescapemap.png")
我注意到您稍后致电getResource
使用Resources
而不是resources
。
当然,它可能是相反的方式 - 也许你的文件夹实际上是resources
,这是第一次调用是可以的,其他四个应该使用resources
。无论哪种方式,两者都不太可能......