【问题标题】:JavaFx Images PathJavaFx 图像路径
【发布时间】:2016-01-23 03:34:57
【问题描述】:

我的 Java 类有问题。实际上代码是正确的,但是如果我单击运行按钮,则会出现由图像路径引起的异常。

static Image currentBackground = new Image("Snake/Images/background_options.png", true);

编译器的信息是:

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

进程以退出代码 1 结束

有人可以帮助我吗?

【问题讨论】:

标签: java image exception javafx path


【解决方案1】:

Image constructor 需要指定URL,而不是文件系统路径。假设您将此图像捆绑为应用程序的一部分,则需要从加载类的同一位置加载该图像:可能是最终部署中的 jar 文件,但可能是开发期间的文件系统。

获取表示应用程序一部分资源的 URL 的机制是在 ClassClassLoader 上调用 getResource()

执行此操作的确切方法取决于您的项目结构,您没有显示,但例如:

new Image(getClass().getResource("Snake/Images/background_options.png").toString(), true);

将从相对于当前类指定的资源中加载图像,并且

new Image(getClass().getClassLoader().getResource("Snake/Images/background_options.png").toString(), true);

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

如果您传递一个表示相对 URL 的 String(即没有方案的 URL,例如 file:http:jar:),那么 Image 构造函数将搜索资源的类路径。换句话说

new Image("Snake/Images/background_options.png", true);

等价于

new Image(getClass().getClassLoader().getResource("Snake/Images/background_options.png").toString(), true);

这似乎有点违反直觉(至少在我看来),所以我更喜欢始终完整地指定一个 URL,或者根据需要从 getClass().getResource()File.toURI().toURL() 检索一个。

【讨论】:

  • 这个答案我不敢苟同。如果您浏览 Image 源代码,那么您可以发现 Image 在内部加载了来自 contextClassLoader 的 url。文档还明确指出,“如果传递的字符串不是有效的 URL,而是路径,则在这种情况下会在类路径上搜索图像”。这意味着new Image("Snake/Images/background_options.png"); 非常好,并且会完全按照应有的方式加载图像,如您的第一个示例所示。
  • 是的,好的,没错。因此,指定一个没有 URL 方案的字符串相当于答案中的第二个代码块(相对于类路径)。不过,我发现这违反直觉:相对 URL 字符串通常被认为是相对于“当前资源”的。所以我认为从某个地方明确获取 URL 更有意义。
  • 我同意,这很奇怪!但是,这就是 API 的设计方式,是显式获取 URL 还是将其留给 Image 构造函数是用户必须做出的选择;)
  • 已编辑问题以包含此讨论。但我想我不确定你在哪里真正不同意答案:它仍在搜索类路径,并且仍在从字符串创建 URL。因此,例如,new Image("Snake/Images/background_options.png") 仍将搜索 jar 文件,如果应用程序以这种方式部署。它只是将其解释为相对 URL(并且相对于类路径)。
  • 可能选词不当。我并不反对,我只是在说明(我觉得)您的回答是要求 OP 明确使用 getClass().getResource(...)getClass().getClassLoader.getResource(...) 并且她加载图像的方式不正确。现在,有了更多信息,它是完美的。 +1
猜你喜欢
  • 2015-02-19
  • 2014-09-27
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 2016-09-28
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多