JavaFx图像路径

Vik*_*ria 0 java javafx image exception path

我的Java类有问题.实际上代码是正确的,但如果我单击运行按钮,则会导致图像路径异常.

static Image currentBackground = new Image("Snake/Images/background_options.png", true);
Run Code Online (Sandbox Code Playgroud)

编译器的消息是:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:122)
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
    at javafx.scene.image.Image.validateUrl(Image.java:1100)
    at javafx.scene.image.Image.<init>(Image.java:624)
    at view.OptionsWindow.<clinit>(OptionsWindow.java:21)
    ... 3 more
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
    at javafx.scene.image.Image.validateUrl(Image.java:1092)
    ... 5 more
Run Code Online (Sandbox Code Playgroud)

进程以退出代码1结束

有谁能够帮我?

Jam*_*s_D 5

Image构造被期待的规范网址,而不是一个文件系统路径.假设您将此映像捆绑为应用程序的一部分,则需要在加载类的同一位置加载它:可能是最终部署中的jar文件,但可能是在开发期间从文件系统中.

该机制得到代表的资源是应用程序的一部分是调用URL getResource()ClassClassLoader.

确切的方法取决于您未显示的项目结构,但例如:

new Image(getClass().getResource("Snake/Images/background_options.png").toString(), true);
Run Code Online (Sandbox Code Playgroud)

将从相对于当前类指定的资源加载图像,以及

new Image(getClass().getClassLoader().getResource("Snake/Images/background_options.png").toString(), true);
Run Code Online (Sandbox Code Playgroud)

将从相对于类路径指定的资源加载图像.

在事件中,你传递一个String代表相对URL(即一个没有方案,如file:,http:jar:),那么Image构造函数将搜索资源类路径上.换一种说法

new Image("Snake/Images/background_options.png", true);
Run Code Online (Sandbox Code Playgroud)

相当于

new Image(getClass().getClassLoader().getResource("Snake/Images/background_options.png").toString(), true);
Run Code Online (Sandbox Code Playgroud)

这似乎有点反直觉(至少对我而言),所以我更喜欢总是完全指定一个URL,或者从适当的地方getClass().getResource()或从File.toURI().toURL()适当的位置检索一个URL .