javafx无法加载图像资源

时间:2018-11-28 14:36:08

标签: javafx nullpointerexception invocationtargetexception

我对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.NullPointerException行中的Image 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创建项目,一切都处于默认状态。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

getClass()。getClassLoader()。getResource()行,在您的Main类所在的位置搜索文件。

如果src中有此映像,则只需添加'/'即可:

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