ImageIcon在Java中加载

时间:2015-03-27 18:39:43

标签: java swing imageicon

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

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

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

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对象来获取图像?

注意:我使用Sublime Text 3和Javatar编译我的代码。文件夹结构(bin文件夹)由Javatar创建。我的“源文件夹”设置为src,上面显示的“根文件夹”是我的闪存驱动器。

=============================================== =====
修改

我尝试了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,但现在不显示图像。我复制并粘贴了整个资源文件夹,以确保它们在两个位置都相同。

1 个答案:

答案 0 :(得分:3)

在类上加载资源时,路径相对于包路径,除非你有一个前导斜杠/。

至于你的icon1.gif,使用

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

应返回正确的网址。

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

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

(注意前导斜线)。


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

  • 确保resources是源文件夹。并非所有项目文件都位于输出文件夹(通常为bin)和JAR之后。
  • 检查输出文件夹以验证它是否包含已编译的类以及资源。 Source and output folders (Eclipse)