我正在尝试在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
中,该项目位于项目中:
项目/ SRC /测试/ DSP / Menu.java
我尝试访问的文件:
项目/资产/图形/测试/ DSP / sslogo.png
我试图在假设此路径相对于Menu
中的当前Menu.java
类并且由于物理目录为project/src/test/dsp/Menu.java
而尝试访问该文件,我正在实现{ {1}}在我的相对路径中三次到达项目目录。然后我简单地将路径放到图像中,如下所示。
../
I am basing my knowledge off of the constructor described in the JavaFX API:
Image ssLogo = new Image("../../../assets/graphics/test/dsp/sslogo.png",
2000, 2000, true, true);
url - 表示用于获取像素数据的URL的字符串
我搜索了大量的问题,但他们的答案没有为我目前的案例提供解决方案。我尝试过getResource,getResourceAsStream和外部资源。我检查了这些方法返回的URL,并且没有使用我提供的路径,如上所示。我也尝试过不同数量的public Image(java.lang.String url,
double requestedWidth,
double requestedHeight,
boolean preserveRatio,
boolean smooth)
,但仍无济于事。诚然,我可能错误地执行了它们,这导致没有成功。
为什么这种通过相对路径访问文件的方法不起作用?如何在当前设置目录的情况下使其工作?
一般来说,通过java中的相对路径访问文件的正确方法是什么?特别是当文件在包外面时,例如这种情况?
将文件放在包中是否更有效,或者无关紧要(显然取决于在包外访问文件的方式)?
答案 0 :(得分:3)
java中的相对路径从项目的根目录开始(在您的情况下是“project”目录),而不是在调用url的类中。所以你的png文件的相对路径是“assets / graphics / test / dsp / sslogo.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);