gpt4 book ai didi

资源文件夹中的 JavaFX 图像

转载 作者:行者123 更新时间:2023-12-01 19:32:53 24 4
gpt4 key购买 nike

出于某种原因,我一直在 gradle javafx 项目中获得 NPE。

我的文件夹结构非常基本。我在 main/java 中有一个包含我的 java 文件的包文件夹。我在 main/resources 中也有我的资源文件夹。当我尝试加载 image.png它给了我一个 NPE。

public static Image createImage(Object context, String url) {
Image m = null;
InputStream str = null;
URL _url = context.getClass().getResource(url);

try {
m = new Image(_url.getPath());
} catch (NullPointerException e) {
e.printStackTrace();
}

return m;
}

这是一个助手类。

来自 Scene我打电话: Image image = Helper.createImage(this, "image.png");图像的绝对路径为 main/resources/images/image.png .

我检查了互联网上的每个教程,但找不到任何解决方案。我还尝试使用图像的路径作为参数以及 InputStream但它从来没有奏效。

最佳答案

资源

Class#getResource(String) 和相关的 API 用于定位相对于类路径和/或模块路径的资源。使用 Class 时要获取资源,您可以传递绝对名称或相对名称。绝对名称将相对于类路径/模块路径的根定位资源;绝对名称以 / 开头.相对名称将相对于 Class 的位置定位资源。 ;相对名称不以 / 开头.

在典型的 Maven/Gradle 项目结构中,src/main/javasrc/main/resources是类路径/模块路径的根。这意味着所有资源名称都与这些目录相关。它比这稍微复杂一些,因为这些目录下的文件被移动到目标/构建目录,并且它是放在类路径/模块路径上的那个位置,但出于所有意图和目的,将源目录视为根目录。首先存在获取资源 API 是有原因的,它提供了一种与应用程序位置无关的获取资源的方式。

代码中的问题

根据您的问题,我收集到您的项目结构如下所示:

<project-dir>
|--src/
|--main/
|--java/
|--resources/
|--images/
|--image.png

你用 Object 调用你的方法和资源名称 image.png .这里的问题是,由于您传递的是相对名称,因此资源位于相对于 Class 的位置。通过的 Object (即 context )。我怀疑您的类(class)位于名为 images 的包中这意味着将找不到相对于所述类的资源。您需要传递一个绝对名称: /images/image.png .

另一个问题是您使用 URL#getPath() . URL您从 Class#getResource(String) 获得如果要找到资源,将看起来像这样:

file:/path/to/gradle/project/build/resources/main/images/image.png

但是 URL#getPath() 的结果会给你:

/path/to/gradle/project/build/resources/main/images/image.png

由于 Image 的方式,这会导致问题。作品。来自 the documentation :

All URLs supported by URL can be passed to the constructor. If the passed string is not a valid URL, but a path instead, the Image is searched on the classpath in that case.



注意第二句。如果传递的 URL 没有方案,则将其解释为资源名称和 Image将相对于类路径定位图像文件。换句话说,因为你传递了 URL#getPath() 的值到 Image它搜索资源 image.png 的构造函数在 path.to.gradle.project.build.resources.main.images .那个包不存在。您应该将 URL 按原样传递给 Image构造函数通过 URL#toString()URL#toExternalForm() .

解决方案

如果您要使用 URLClass#getResource(String) 返回加载 Image那么无论你需要使用什么 URL#toString()URL#toExternalForm()而不是 URL#getPath() .

public static Image createImage(Object context, String resourceName) {
URL _url = context.getClass().getResource(resourceName);
return new Image(_url.toExternalForm());
}

那么你至少有两个选择:
  • 将绝对资源名称(即 "/images/image.png" )传递给您的 #createImage(Object,String)方法自 image.png资源与传递的 Object 不在同一个包中(即 context )。
  • 将资源移动到与传入的类相同的包中Object (即 context )。例如,如果上下文对象的类是 com.foo.MyObject然后将资源放在 src/main/resources/com/foo 下它将与 MyObject 在同一个包中.这将允许您继续传递相对资源名称。

  • 当然,正如 Image 的文档所述您可以传递无方案的 URL,并将其解释为资源名称。换句话说,你可以这样做:

    Image image = new Image("images/image.png");

    这应该有效。但是,请注意:使用模块时,仅当包含资源的包为 opens 时,上述内容才有效。无条件或如果模块本身是 open .

    关于资源文件夹中的 JavaFX 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59029879/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com