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