在按钮上使用图像之后,当我构建创建.jar文件并仅执行文件的应用程序时,图像不在那里但只会显示我是否将图像文件夹复制到与jar相同的目录中文件。为什么会这样,如果可能的话我该如何解决?
我目前正在使用以下代码设置图标/图像:
JButton btn = new JButton("Text", "img/icon.png");
答案 0 :(得分:0)
我认为您需要了解
类加载器:
典型的策略是将名称转换为文件名然后 从文件系统中读取该名称的“类文件”。
因此,您可以使用getResource
public URL getResource(String name)
查找具有给定名称的资源。资源是一些数据 (图像,音频,文本等)可以通过类代码以某种方式访问 这与代码的位置无关。
答案 1 :(得分:0)
当你将图像存放在罐子外面时,可以使用这些图片,这表明你正在做一些类似的事情:
File image = new File("directory/image.jpg");
InputStream is = new FileInputStream(image);
这将从文件系统上的目录中读取文件,而不是从类路径中读取。现在,如果您已将图像打包在"目录"在Jar中,你必须从类路径加载图像。
InputStream is = getClass().getResourceAsStream("/directory/image.jpg");
(注意路径中的斜线)
或者
InputStream is = getClass().getClassLoader().getResourceAsStream("directory/image.jpg");
(注意路径中没有斜线)
您的示例现在不应该编译。 (JButton construtor的第二个参数是Icon,而不是String,java 8)。因此,当您从文件系统获取图像时,您可能正在做其他事情。
使用您的示例,您需要从输入流中读取图像并将其转换为图标:
try (InputStream is = getClass.getClassLoader().getResourcesAsStream("directory/image.jpg")) {
BufferedImage image = ImageIO.read(is);
return new JButton("Text", new ImageIcon(image));
} catch (IOException exc) {
throw new RuntimeException(exc);
}
那应该使用位于"目录"中的图像。你的罐子里面。当然,您需要在jar中包含图片,否则您将在输入流NullPointerException
上获得is
。