ImageIcon 正在加载 Java

ImageIcon Loading in Java

我已经搜索了 Google、SE 和 Oracle 的文档以获取有关如何执行此操作的信息,但我似乎无法使其工作。

我找到了几篇关于使用 getResource() 还是 getResourceAsStream() 以及如何格式化文件名的帖子,但是 none 我可以应用到我的情况。

我的目录结构如下所示(在资源文件夹中有一些额外的级别):

Root Folder
|
|_____ bin (compiled .class files go here)
|
|_____ src
|         |
|         |_____ packageA
|         |         |
|         |         |_____ packageAa
|         |                   |
|         |                   |_____ images.java
|         |                   |
|         |                   |_____ resources
|         |                             |
|         |                             |_____ icon1.gif
|         |
|         |_____ packageB
|         |
|         ... (More packages with sub-packages)
|
|_____ resources (should it go here?)
          |
          |_____ icon2.gif

在我的实际程序中,我有 107 个 gif 图像,其文件名可以从对象值派生。这些图像目前位于两个资源文件夹中,因为我一直在尝试让一个工作。

我当前的代码尝试这样做:

String imageFileName = getFileName(obj);  // returns a string such as "/resources/cardImages/acespades.gif"
URL imageURL = getClass().getClassLoader().getResource(imageFileName);
ImageIcon icon = new ImageIcon(imageURL);

无论前导反斜杠如何,我总是收到空指针异常。

我应该如何格式化文件名和/或创建一个 URL 对象来获取图像?

注意:我使用带有 Javatar 的 Sublime Text 3 来编译我的代码。文件夹结构(bin 文件夹)由 Javatar 创建。我的 "Source folder" 设置为 src 而上面显示的 "root folder" 是我的闪存驱动器。

============================================= =======
编辑:

我尝试了 Peter 的建议,结果如下:

URL imageURL = getClass().getResource("resources/cardImages/back1.gif");
System.out.println(imageURL);
ImageIcon icon = new ImageIcon("resources/cardImages/back1.gif");

println 语句打印出 null,但 ImageIcon 确实正确显示图像。我知道这会从 .java 文件旁边的文件夹加载图像。

URL imageURL = getClass().getResource("/resources/cardImages/back1.gif");
System.out.println(imageURL);
ImageIcon icon = new ImageIcon("/resources/cardImages/back1.gif");

println还是打印null,但是现在图像不显示了。我复制并粘贴了整个资源文件夹,以确保它在两个位置都相同。

通过 class 加载资源时,路径是相对于包路径的,除非你有前导斜杠 /。

至于你的icon1.gif,使用

URL url = getClass().getResource("resources/icon1.gif");

应该return正确URL。

我建议将 Java 来源和资源分开。如果资源是源文件夹(其输出文件夹是 bin/the JAR 的根目录),请使用:

URL url = getClass().getResource("/icon2.gif");

(注意前导斜杠)。


编辑(问题已更新):
更正了第二个URL(资源是源文件夹,icon2.gif位于其根目录)。
我刚刚在 Eclipse 中验证了它,并且我得到了两种变体的正确(非空)URLs。使用 ImageIcons 中的 URLs 也给出了正确的结果,显示了图像。

  • 确保 resources 是源文件夹。并非所有项目文件都位于输出文件夹(通常为 bin)和后来的 JAR 中。
  • 检查您的输出文件夹以确认它包含已编译的 classes 以及资源。