我正在尝试用JavaFX制作一个简单的菜单。当我尝试使用相对路径加载图像时,我会收到以下异常:
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.java:1110)
我正在使用eclipse,尽管这个问题似乎不是eclipse特有的,因为我在终端中运行时收到了同样的异常。此外,由于某些原因,当文件位于包内或src文件夹中时(给定的路径会适当更改),它也能工作。
我当前的活动类Menu.java
在包test.dsp
中,该包位于项目中,名称为:
project/src/test/dps/Menu.java
我试图访问的文件:
项目/资产/图形/测试/dps/sslogo.png
我试图访问该文件,假设该路径是相对于Menu.java
中的当前Menu
类的,并且由于物理目录是project/src/test/dsp/Menu.java
,我在我的相对路径中实现了三次../
以到达项目目录。然后我简单地把路径的图像如下所示。
Image ssLogo = new Image("../../../assets/graphics/test/dsp/sslogo.png",
2000, 2000, true, true);
我的知识基于JavaFX API中描述的构造函数:
public Image(java.lang.String url,
double requestedWidth,
double requestedHeight,
boolean preserveRatio,
boolean smooth)
url-表示在提取像素数据时使用的url的字符串
我搜索了很多问题,但他们的答案并不能解决我目前的问题。我尝试过getResource、getResourceAsStream和外部资源。我检查了通过这些方式返回的URL,但没有一个能使用我提供的路径,如上所示。我也尝试了不同数量的../
,但仍然没有效果。诚然,我可能错误地执行了它们,导致了失败。
为什么这种通过相对路径访问文件的方法不起作用,以及如何在设置当前目录的情况下使其起作用?
在java中,通过相对路径访问文件的正确方法是什么?特别是当文件在包之外时,比如这种情况?
- 有没有一种方法可以通过java类中的代码将文件包含到文件路径中
将文件放在包内更有效,还是无关紧要(显然取决于访问包外文件的方式)?
- 有没有更有效的方法通过java访问文件
java中的相对路径从项目的根目录(在您的情况下是"project"目录)开始,而不是从调用url的类开始。因此,你的png文件的相对路径将是"assets/graphics/test/dsp/ssrogo.png"。
通常情况下,包对相对路径没有影响。
更有效的方法是将图像和其他静态文件保存在不同的目录中。"src"文件夹是为.java文件保留的。
更新:
正如帖子中所说:https://stackoverflow.com/a/16122215/6629388
如果您没有在URL的开头使用http:或file:Image ssLogo = new Image("file:assets/graphics/test/dsp/sslogo.png", 2000, 2000, true, true);