当前位置: 首页 > 知识库问答 >
问题:

来自资源文件夹的JavaFX图像

陶睿
2023-03-14

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

我的文件夹结构非常基本。我在main/java文件夹中有一个包含java文件的包。我的资源也在main/resources文件夹中。当我尝试加载图像时。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;
}

这是一个助手类。

场景中我调用:Image=Helper。createImage(此为“image.png”) 图像的绝对路径为main/resources/images/image。png

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


共有3个答案

梁晋鹏
2023-03-14

这就是我在应用程序中传递图像的方式。ivSerialAssignmentLogo是一个FXML元素(ImageView)。

ivSerialAsSignmentLogo.setImage(new Image(getClass(). getResourceAsStream("/img/Series alAssignment.svg ")));

对你来说,你可以用这样的东西

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

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

    return m;
}

姬俊能
2023-03-14

尝试使用路径/images/image。png

资源总是从类根引用,在您的例子中是src/main/resources,因此从那里转到/images/image。png应该是正确的路径。

霍财
2023-03-14

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

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

根据您的问题,我推断您的项目结构如下:

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

您使用对象图像的资源名调用方法。png。这里的问题是,由于传递的是相对名称,因此资源的位置相对于传递的对象的(即上下文)。我怀疑您的类是否位于名为images的包中,这意味着无法找到与所述类相关的资源。您需要传递一个绝对名称:/images/image。png

另一个问题是使用URL#getPath()。从Class#getResource(String)获取的URL如果要找到资源,将如下所示:

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

但是URL#getPath()的结果将为您提供:

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

由于图像的工作方式,这会导致问题。从文件中:

URL支持的所有URL都可以传递给构造函数。如果传递的字符串不是有效的URL,而是路径,则在这种情况下,将在类路径上搜索图像。

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

如果您要使用类#getResources(String)返回的URL来加载Image,那么无论您需要使用URL#toString()URL#toExtern alForm()来代替的URL#getPath()

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

那么你至少有两个选择:

>

将资源移动到与在Object(即上下文)中传递的类相同的包。例如,如果上下文对象的类是com.foo.MyObject,那么将资源放在src/main/Resources/com/foo下,它将与MyObject在同一个包中。这将允许您继续传递相对资源名称。

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

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

这应该行得通。但是,请注意:当使用模块时,只有当包含资源的包无条件地打开或模块本身打开时,上述方法才会起作用。

 类似资料:
  • 资源(Asset)代表 source 文件夹中除了文章以外的所有文件,例如图片、CSS、JS 文件等。比方说,如果你的Hexo项目中只有少量图片,那最简单的方法就是将它们放在 source/images 文件夹中。然后通过类似于 ![](/images/image.jpg) 的方法访问它们。 对于那些想要更有规律地提供图片和其他资源以及想要将他们的资源分布在各个文章上的人来说,Hexo也提供了更组

  • 我正在创建一个javafx GUI应用程序,我的项目是一个maven配置的项目。我希望能够在我的控制器中引用我的fxml文件,如下所示: 其中,我的main.fxml文件位于src/main/resources文件夹中,而我的控制器位于src/main/java文件夹中。我该怎么做呢?我的src/main/resources文件夹在构建路径中,并且我能够从src/main/java文件夹中的类调用

  • 项目结构: 我目前正在Eclipse中开发一个JavaFX应用程序,在从resources文件夹加载一个. css样式表时遇到了问题。 我已经将资源文件夹添加到类路径(项目属性 - 正在使用以下代码: 正在抛出 NullPointerException 我已经阅读了其他帖子并尝试了所有内容,但似乎无法让它工作。 编辑:设法通过删除和恢复bin文件夹使其正常工作。现在加载了.css,但由于某些原因它

  • 这是我的服务方法 这是我的控制器方法 当我使用我的服务器时,我会得到HTTP状态500类路径资源[output.png]无法解析为URL,因为它不存在

  • 我使用JavaFX显示超文本标记语言帮助: 、和各种图像都驻留在内的文件夹中: 从,我正在使用相对链接加载CSS和图像: 在OSX上,一切都非常好(无论是从IDE还是从jar启动)。在Windows上,从jar启动时,CSS和img链接不再解析(从IDE启动可以正常工作)。 有没有更好、更健壮的链接资源的方法?

  • 这是我当前的方法。print staement目前是文件的字符串值,我希望servlet返回该文件。