javafx 无法加载图片资源

Posted

技术标签:

【中文标题】javafx 无法加载图片资源【英文标题】:javafx cannot load image resource 【发布时间】:2019-04-30 12:05:40 【问题描述】:

我是 javafx 的新手,在使用代码教程进行测试时得到了java.lang.reflect.InvocationTargetException

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application 

    public static final String IMAGE_NAME = "groceries.jpg";

    public static void main(String[] args) 
        launch(args);
    

    @Override
    public void start(Stage primaryStage) throws Exception 
        Scene scene = new Scene(setupScene(), 300, 300);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Image Screen");
        primaryStage.show();
    

    StackPane setupScene() 
        StackPane root = new StackPane();

        ImageView imageView = new ImageView();
        imageView.setPreserveRatio(true);
        imageView.setSmooth(true);

        Image image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString());
        imageView.setImage(image);

        root.setPrefSize(250, 250);
        imageView.setFitHeight(root.getPrefHeight());
        imageView.setFitWidth(root.getPrefWidth());
        root.getChildren().add(imageView);

        return root;
    


异常是由java.lang.NullPointerExceptionImage image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString());行引起的

图像文件在我的项目文件夹中,但似乎没有加载。我能够使用Image image = new Image(new File(IMAGE_NAME).toURI().toURL().toString()) 获取图像,但是当我切换回Image image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString()) 时,它就无法正常工作。

有人知道我的程序为什么会这样吗?任何想法将不胜感激...

编辑:我的图像文件在 src 文件夹的同一级别:

- projectfolder
     - groceries.jpg
     - src
        - Main.java

我正在使用 IntelliJ JavaFX Application 创建项目,一切都处于默认状态。

【问题讨论】:

图片在项目中的位置? 运行应用时工作目录是类路径根目录吗? 【参考方案1】:

Image image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString())Image image = new Image(new File(IMAGE_NAME).toURI().toURL().toString()) 做两件不同的事情。

第一个将基于类加载器获取资源,这在直接从 jar 文件中提取资源时最常用。第二个用于从文件系统加载图像,这就是为什么它适用于您的情况(这就是文件所在的位置!)

【讨论】:

谢谢!但是有没有办法让我使用第一种方法获取图像文件而不是异常? 当然,你可以切换方法(先试试文件)然后检查new File(IMAGENAME).exists()【参考方案2】:

getClass().getClassLoader().getResource() 行在 Main 类所在的同一位置搜索文件。

如果你在 src 中有这个图片,你只需要添加一个 '/' :

private String theme1Url = getClass().getResource("/groceries.jpg").toExternalForm();

【讨论】:

谢谢!在我将图像文件移动到 src 文件夹后,它就起作用了。但是添加斜线仍然给了我这个例外:-[ 如果将文件移动到 src 中,则不需要斜线,斜线就是项目文件夹中的文件:)

以上是关于javafx 无法加载图片资源的主要内容,如果未能解决你的问题,请参考以下文章

使用资源文件夹在使用 IntelLiJ 的 JavaFX 项目上加载图像

加载图片时,图片网址中包含中文参数,无法加载数据

关于解决 从相册中选择照片后无法剪切图片以及无法加载图片的问题

图片加载库Glide——解决图片错乱+无法设置tag

Flutter 开发的应用程序在手机上无法加载网络图片资源

“错误:无法找到或加载主类”JavaFX终端