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。使用 ImageIcon
s 中的 URLs 也给出了正确的结果,显示了图像。
- 确保
resources
是源文件夹。并非所有项目文件都位于输出文件夹(通常为 bin
)和后来的 JAR 中。
- 检查您的输出文件夹以确认它包含已编译的 classes 以及资源。
我已经搜索了 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。使用 ImageIcon
s 中的 URLs 也给出了正确的结果,显示了图像。
- 确保
resources
是源文件夹。并非所有项目文件都位于输出文件夹(通常为bin
)和后来的 JAR 中。 - 检查您的输出文件夹以确认它包含已编译的 classes 以及资源。