Java 通过相对路径访问包外的文件以作为图像加载 (JavaFX)

Java Access File Outside of Package via Relative Path to load as Image (JavaFX)

我正在尝试用 JavaFX 制作一个简单的菜单。当我尝试使用相对路径加载图像时,我收到以下异常:

Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
  at javafx.scene.image.Image.validateUrl(Image.java:1110)

我正在使用 Eclipse,尽管这个问题似乎不是 Eclipse 特有的,因为在终端中 运行 时我收到了相同的异常。此外,出于某种原因,当文件位于包内或 src 文件夹中时(给定路径已适当更改),它也能正常工作。

我的当前活动 class Menu.java 在包 test.dsp 中,它在项目中的位置为:

project/src/test/dsp/Menu.java

我试图访问的文件:

project/assets/graphics/test/dsp/sslogo.png

我假设此路径是相对于 Menu.java 中的当前 Menu class 并且由于物理目录是 project/src/test/dsp/Menu.java,我在我的相对路径中执行了三次 ../ 以到达项目目录。然后我简单地把图片的路径放在下面。

Image ssLogo = new Image("../../../assets/graphics/test/dsp/sslogo.png",
            2000, 2000, true, true);

I am basing my knowledge off of the constructor described in the JavaFX API:

public Image(java.lang.String url,
     double requestedWidth,
     double requestedHeight,
     boolean preserveRatio,
     boolean smooth)

url - the string representing the URL to use in fetching the pixel data

我已经搜索了过多的问题,但他们的答案并没有提供使我当前的案例有效的解决方案。我试过 getResource、getResourceAsStream 和外部资源。我检查了通过这些方式返回的 URL 并且 none 使用我提供的路径,如上所示。我也尝试了不同数量的../,仍然没有用。不可否认,我可能实施错误,导致没有成功。

java 中的相对路径从项目的根目录开始(在您的例子中是 "project" 目录),而不是 class,其中 url叫。所以你的 png 文件的相对路径是 "assets/graphics/test/dsp/sslogo.png".

一般包对相对路径没有影响。

更有效的方法是像您一样将图像和其他 static 文件保存在不同的目录中。 "src" 文件夹是为 .java 个文件保留的。


更新:

如 post 所述:

如果您不在 URL 的开头使用 http:file:将在(默认)包中搜索资源。因此,在您的情况下,获取文件的好方法是使用以下行:

Image ssLogo = new Image("file:assets/graphics/test/dsp/sslogo.png", 2000, 2000, true, true);