javafx не может загрузить ресурс изображения - PullRequest
0 голосов
/ 28 ноября 2018

Я очень новичок в 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 голосов
/ 28 ноября 2018

В строке getClass (). GetClassLoader (). GetResource () выполняется поиск файла в том же месте, где находится основной класс.

Если у вас есть это изображение вsrc, вам просто нужно добавить '/':

private String theme1Url = getClass().getResource("/groceries.jpg").toExternalForm();
0 голосов
/ 28 ноября 2018

Image image = new Image(getClass().getClassLoader().getResource(IMAGE_NAME).toString()) и Image image = new Image(new File(IMAGE_NAME).toURI().toURL().toString()) делают две разные вещи.

Первая получает ресурс на основе загрузчика классов, который чаще всего используется при извлечении ресурса непосредственно из файла jar.Второй используется для загрузки изображения из файловой системы, поэтому это работает в вашем случае (вот где файл!)

...