我有一个应用程序加载图像以创建一个带有图标的按钮。从IDE启动时,它可以正常工作,但是当从导出的jar文件启动时,它会提供图像提取错误。
图片位置:
+Project
-Source Packages
-Tools
-start.jpg
使用的代码:
static final String STARTIMAGE = "/Tools/start.JPG";
public static JButton createStartButton() {
Image img = Toolkit.getDefaultToolkit().getImage(GUITools.class.getResource(STARTIMAGE));
JButton b = new JButton("",new ImageIcon(img));
b.setPreferredSize(smallButton);
b.setMaximumSize(smallButton);
b.setMinimumSize(smallButton);
return b;
现在,最奇怪的是,在另一个屏幕中,一个按钮以完全相同的方式创建,这个工作得很好...... 代码:
static final String PREVIOUSIMAGE = "/Tools/previous.gif";
public JButton createPreviousButton(){
Image img = Toolkit.getDefaultToolkit().getImage(getClass().getResource(PREVIOUSIMAGE));
JButton b = new JButton("Previous",new ImageIcon(img));
b.setPreferredSize(dimensionButton);
b.setMaximumSize(dimensionButton);
b.setMinimumSize(dimensionButton);
return b;
}
唯一的区别是一个是静态的,但即使像另一个那样使它变得非静态,它仍然无法工作。
我尝试了在论坛和其他网站上找到的所有内容,包括这个好主题:
How to bundle images in jar file (主题末尾生成的url只是'null')
似乎没什么用......请帮忙!
谢谢!
答案 0 :(得分:0)
从IDE启动时,它工作得很好,但是从导出的jar文件启动时,它会产生图像提取错误。
Image img = Toolkit.getDefaultToolkit().getImage(getClass().getResource(PREVIOUSIMAGE));
上述方法不正确,请改用:
private static BufferedImage readBufferedImage (String imagePath) {
try {
InputStream is = YourClassName.class.getClassLoader().getResourceAsStream(imagePath);
BufferedImage bimage = ImageIO.read(is);
is.close();
return bimage;
} catch (Exception e) {
return null;
}
}
最好在应用程序启动时加载所有图像,然后再使用它们。
答案 1 :(得分:0)
在我看来,你的图像是在一个包中,所以实际的链接可能是“package.name/Tools/start.jpg”或其他什么时候编译,所以应该移动图像。
而不是将其放在像:
这样的包中+Project -Source Packages -Tools -start.jpg
做这样的事情。
+Project Folder
-Source Packages/
-Tools/
-start.jpg