【问题标题】:Add images to jar将图像添加到 jar
【发布时间】:2015-01-30 04:27:36
【问题描述】:

我想为我的 JFrame 设置图标。我执行以下操作:

Image icon = Toolkit.getDefaultToolkit().getImage("src/images/icon.jpg");
this.setIconImage(icon);

当我从 netbeans 运行此代码时,它工作正常,但是当我尝试从 jar 文件运行此代码时,图像未显示在我的 JFrame 中。我尝试将图像作为资源加载:

this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/images/icon.jpg")));

但是当我运行此代码时,它会以NullPointerException 失败

 Uncaught error fetching image:
java.lang.NullPointerException
        at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:99)
        at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:113)
        at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
        at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
        at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)

我怎样才能完成这项工作?

编辑: 谢谢大家, 通过将图像指定为解决问题

Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("images/icon.JPG"))

至于好像比较奇怪,如果是这样就更好了

this.setIconImage(new ImageIcon(pathToIcon).getImage());

【问题讨论】:

  • 您的 JAR 文件的结构是什么,即图像在 JAR 文件中的确切位置是什么?

标签: java jar


【解决方案1】:

假设您的 JAR 文件有一个名为 images 的顶级目录,您可以使用以下任一方法:

  1. getClass().getResource("/images/icon.jpg")
  2. getClass().getClassLoader().getResource("images/icon.jpg")

【讨论】:

    【解决方案2】:

    查看 URLImageSource 的源代码,getConnection 抛出 NPE 的原因似乎是它的 url 有一个 null。这让我怀疑

    getClass().getResource("/src/images/icon.jpg")
    

    正在返回null。如果找不到具有该路径名的资源,它将执行此操作。

    我敢打赌,问题是你走错了路。

    要证明/反驳这一点,您应该在 JAR 文件上运行 jar tvf,并查找与 "icon.jpg" 匹配的行。对应的路径名与您使用的路径名相同吗?如果没有,请使用 getResource 调用中匹配行的路径名,它应该可以工作。或者,如果文件根本不显示,请查看 NetBeans 构建配置,告诉它在 JAR 文件中放入什么。 (我不是 NetBeans 用户,所以我不能说你需要看哪里......)


    如果这绝对不会导致您无处可去,另一种可能性是getClass().getResource(...) 正在使用一个不知道包含图像的 JAR 文件的类加载器。 (这对我来说似乎不太可能......)

    【讨论】:

    • jar tvf 显示 icon.jpg 位于 images/icon.jpg 中,但 getClass().getResource("/images/icon.jpg") 和 getClass().getResource("images /icon.jpg") 不起作用。但是 getClass().getClassLoader().getResource("images/icon.jpg") 工作正常。
    • 我也有同样的问题,但我是在 main 方法中做的,所以“getClass()”不起作用。我应该放什么而不是那个?我尝试创建一个主类的新实例,但是当我尝试它时给了我一个异常。
    • 试试YourMainClass.class.getClassLoader().getResource(resourePath)
    【解决方案3】:

    getResource() 从类路径加载资源,而不是操作系统路径,编译后您的类路径将不包括 /src 文件夹,而只是其内容。所以你最好试试/images/icon.jpg

    您也可能会发现this discussion 有点用处。

    【讨论】:

      【解决方案4】:

      假设您可以导入 javax.imageio.ImageIO,这应该可以做到:

      Image icon = ImageIO.read(this.getClass().getResource("/src/images/icon.jpg"));
      this.setIconImage(icon);
      

      【讨论】:

      • 在指定位置找不到这样的文件,但是在那儿
      • hmm..您可以尝试将图像文件移动到外部文件夹,但与 src 目录处于同一级别。喜欢:“/resources/images/icon.jpg”?
      【解决方案5】:
      .."/src/images/icon.jpg"..  
      

      地址的“/src”前缀看起来很可疑。许多应用程序。将提供单独的 'src' 和 'build' 目录,但通常会导致生成的 Jar 中不使用 'src' 前缀。我建议尝试..

      .."/images/icon.jpg".. 
      

      & 还 三重 检查图像是否在代码期望找到它的 Jar 的位置。

      【讨论】:

        【解决方案6】:

        为此,您应该从相对于某个固定类的目录访问图像。 例如,如果图像文件保存在与Toolkit.class同级的目录“images”中,则

        this.setIconImage(Toolkit.getDefaultToolkit().getImage(Toolkit.class.getResource("images/icon.jpg"))); 应该管用。

        【讨论】:

          【解决方案7】:

          您可以简单地在主源代码中创建一个包,并将您的图像包含在这个包中。然后,只需调用主类中的图像,例如:

          ImageIcon a = new ImageIcon(MainClass.class.getResource("/Package/Image.jpg"));

          【讨论】:

            【解决方案8】:
            JFrame f = new JFrame("Edit Configure File");
            //Image image = ImageIO.read(getClass().getResource("images/ctx.Icon"));
            f.setIconImage(new ImageIcon("images/ctx.PNG").getImage());//this works for me finally
            //f.setIconImage(image);
            //f.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("images/ctx.PNG")));
            

            【讨论】:

              猜你喜欢
              • 2010-11-08
              • 1970-01-01
              • 2011-02-16
              • 1970-01-01
              • 2013-09-04
              • 1970-01-01
              • 2014-06-03
              • 1970-01-01
              • 2021-12-01
              相关资源
              最近更新 更多