所以我试图在我的应用程序结构中进一步访问存储在res包中的图像。
结构看起来像这样
src
-> package1
-> -> innerPackage1
-> -> -> Test.java
-> res
-> -> image.png
所以我试图从内部类访问图像。 这就是我到目前为止所尝试的以及路径的更多变化,这似乎从来没有用过。
URL resource = Test.class.getResource("/res/image.png");
ImageIcon image = new ImageIcon(ImageIO.read(resource));
ImageIcon image = new ImageIcon("./res/image.png");
让我感到困惑的是我甚至尝试将图像直接放入与java类相同的包中并调用
ImageIcon image = new ImageIcon("image.png");
即使那样也没有用,所以现在我完全停顿了。
它唯一适用于我的是当我将类文件和图像文件直接移动到src文件中时
src
-> Test.java
-> image.png
然后这终于奏效了:
new ImageIcon( "./src/image.png" )
我现在想知道我使用的IDE构建路径是否有问题 - intellij。
此应用程序将用于不同的设备,因此需要使用相对路径。
非常感谢
答案 0 :(得分:1)
您可以尝试通过当前线程使用上下文类加载器来获取图像资源。
这些方面的东西:
public static void main(String[] args) throws IOException {
URL resource = Thread.currentThread().getContextClassLoader().getResource("res/image.png");
ImageIcon image = new ImageIcon(ImageIO.read(resource));
}
答案 1 :(得分:1)
这个项目中的文件夹结构看起来非常不寻常。那应该是:
src
|-main
|-java
| |-package1
| |-innerPackage1
| |-Test.java // although *Test* should be under src/test
|-resources
|-image.png
在IntelliJ项目配置中,src/main/java
应标记为"来源root"和src/main/resources
as"资源root"。这可以在项目设置中完成,也可以在文件夹上单击鼠标右键。
重组项目后,图像应可通过getResource("/image.png")
访问。或者,移到src/main/resources/package1/innerPackage1
,通过getResource("image.png")
。
使用相对路径进行一些测试后,使用原始文件夹结构。
Test.class.getResource(".")
应该返回:
file:/{path to project}/{project name}/out/production/{project name}/package1/innerPackage1
因此,如果我们调用Test.class.getResource("../..")
,我们会爬到根网址以获取包含内容:
file:/{path to project}/{project name}/out/production/{project name}/
现在,如果我们致电Test.class.getResource("../../res/image.png")
,它就会变得可以访问。
URL resource = Test.class.getResource("../../res/image.jpg");
ImageIcon image = new ImageIcon(ImageIO.read(resource));
这应该可以解决问题,但它远不是一个干净的解决方案。
IntelliJ将 src
文件夹视为"来源root"文件夹,它不能包含资源文件夹里面。 src
未包含在目标路径中,也不应包括res
。
所以我建议将res
文件夹移动到与src
相同的级别,并将其标记为"资源root"。之后,以下内容应该正常工作:
URL resource = Test.class.getResource("/image.jpg");
ImageIcon image = new ImageIcon(ImageIO.read(resource));