使用构建的jar文件

时间:2017-07-26 20:31:20

标签: java user-interface jar

在按钮上使用图像之后,当我构建创建.jar文件并仅执行文件的应用程序时,图像不在那里但只会显示我是否将图像文件夹复制到与jar相同的目录中文件。为什么会这样,如果可能的话我该如何解决?

我目前正在使用以下代码设置图标/图像:

JButton btn = new JButton("Text", "img/icon.png");

2 个答案:

答案 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