【问题标题】:Once exported, java cannot find/draw images导出后,java 无法找到/绘制图像
【发布时间】:2011-12-08 22:54:56
【问题描述】:

你好stackoverflowites,

我正在开发一个 2d 游戏,当我在 eclipse 中运行它时,我的程序可以很好地加载它的所有图像和资源。但是,我正在使用非必要推荐的方式来创建我的图像和图像图标,如下所示:

bannerLogo.setIcon(new ImageIcon("/res/client/BannerHeader.jpg"));

现在,当导出到 jar 时,它不显示图像(这是预期的,因为我没有使用正确的方式。)

我搜索了正确的方法,我发现是:

URL imgURL = getClass().getResource("/res/client/BannerHeader.jpg");
Image bannerImg = Toolkit.getDefaultToolkit().getImage(imgURL);
bannerLogo.setIcon(new ImageIcon(bannerImg));

这也不起作用,我得到一个“未捕获的错误获取图像:”跟踪,它只是告诉我我的 URL (imgURL) 为空。 (这是我在 eclipse 中运行的时候,请注意,我什至还没有导出它)

我认为这与我的类路径有关,但我不知道是什么。

在eclipse里面,我的包结构如下:

(父目录,项目名称)

+src 文件夹,在构建路径上有普通包等

+resource 文件夹,(“res”),不在构建路径上(在构建路径上尝试过,没有任何改变)

+++资源文件夹的子目录

伙计们,我不知道该怎么办。对不起,文字墙。

【问题讨论】:

  • 导出JAR的时候,图片文件也导出了吗?
  • 我只是从默认导出菜单中导出可运行的 jar,但是当我在其中打开它时。
  • 你使用的路径是相对路径还是绝对路径?

标签: java image swing resources awt


【解决方案1】:

好吧,如果您遵循方法一,我认为您只需在 eclipse 中创建可运行的 jar 文件。然后,您需要将要加载的图像与 jar 文件放在同一目录中,并具有您在程序中提到的相同相对路径。例如

 your_directory
             ---> game_runnable.jar
             ---> res
                  ---> client 
                       -->BannerHeader.png

我认为它会起作用。

【讨论】:

  • 那么您认为我应该手动进入文件并移动内容直到它们与 Eclipse 中的相同吗?我觉得必须有比这更好的方法。 ://
  • 不,不需要将图像与类文件放在同一目录中,实际上我建议不要这样做。而是将它们放在类文件之外的目录中,可能标题为图像。然后将这些作为资源而不是文件查找。这并没有解决他没有捕获异常的问题,并且对“遵循方法 1”给出了错误的建议,这意味着在 Jar 文件中查找文件。 -1.
  • 方法 1 是他在代码中提到的简单链接。资源没有打包到 jar 文件中,只有类。您需要创建可运行的 jar 文件,然后直接将“资源文件夹”添加到与可运行 jar 相同的级别。您不是在 jar 本身中寻找任何文件,而是使用定义的相对路径来访问图像。
【解决方案2】:

您的代码最初是在寻找图像文件,而 Jar 文件中不存在文件,而只是资源。所以你尝试使用getClass.getResource("/res/client/BannerHeader.jpg");是正确的。但请确保图像实际上位于类文件目录之外的目录中的 jar 文件中,并使用相对于类路径目录的路径。

这个错误并不是告诉你这是错误的或者文件是空的,而是你需要把它放在一个 try/catch 块中。我建议您阅读Exceptions Tutorial 了解更多信息。

编辑 1
当你说你有一个未捕获的异常错误时,在我看来你有一个编译错误,而不是运行时异常。很抱歉造成混乱。

至于放置图像的位置,这在一定程度上取决于您使用的 IDE。我使用 Eclipse,并从我的 java 文件包目录中添加了一个目录,我称之为图像并将我的图像放在那里。然后我使用资源来查找“images/MyImage.jpg”。

例如,假设我在 Eclipse 中的包如下所示:

所以类文件位于 myPackage 包中,而图像文件 GridBoxClassPic.JPG 位于类文件目录之外的 images 目录中,因此我可以使用字符串 String RESOURCE_PATH = "images/GridBoxClassPic.JPG"; 找到它。

此代码可以显示图像:

import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class MyClass {
   private static final String RESOURCE_PATH = "images/GridBoxClassPic.JPG";

   public MyClass() {
      try {
         BufferedImage image = ImageIO.read(getClass().getResource(RESOURCE_PATH));
         ImageIcon icon = new ImageIcon(image);
         JLabel label = new JLabel(icon);
         JOptionPane.showMessageDialog(null, label);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      new MyClass();
   }
}

【讨论】:

  • “在类文件目录之外的目录中的 jar 文件中”是什么意思?当我将它放在 try/catch 中时,我会得到这个错误,这似乎是一个致命错误。 :p
  • 我想通了,我引用了一个与我的 src 文件夹同等级别的文件夹,无论出于何种原因,它都不喜欢那样。非常感谢,两位都帮忙了。 :)
  • @BitCrash:请参阅编辑 1
  • 编辑 2: -- 叹息,浪费时间......但不是真的,因为底线是不管有没有我的帮助,你都想通了。干得好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2019-05-06
相关资源
最近更新 更多