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

时间:2016-07-24 00:47:38

标签: java image file javafx classpath

我正在尝试在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中的相对路径访问文件的正确方法是什么?特别是当文件在包外面时,例如这种情况?

    • 有没有办法通过java类中的代码将文件包含到文件路径中?
  • 将文件放在包中是否更有效,或者无关紧要(显然取决于在包外访问文件的方式)?

    • 是否有更有效的文件访问方式通过java?

1 个答案:

答案 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);