ImageIcon не находит фото, путь правильный

Я пытаюсь импортировать некоторые фотографии, используя приведенный ниже код. Кажется, что проверка, которую я только что добавил (оператор if), возвращается как «yay», так что файл есть. Таким образом, он может найти файл, который работает нормально, но по какой-то причине он не может импортировать файл и создать значок изображения. Любая помощь будет принята с благодарностью! Я также пробовал с относительным путем, но безуспешно!

Любая помощь будет принята с благодарностью, так как я уже давно ломаю голову над этим!

public class Photos {

    ImageIcon bi = new ImageIcon();
    // Position
    private int x, y;
    // Diameter (storlek)
    private int diameter;
    private int dynamicdiameter;

    public void importPhoto(String name) {
        String path = "/Users/Cedric/Dropbox/UU/OOPJ/Foton/src/img/";
        File imageCheck = new File(path+name);
        if (imageCheck.exists()){
            System.out.println("yay");
        }
        else{System.out.println("noo");}

            ImageIcon bi = createImageIcon(path+name, "Photo");
    }

    protected ImageIcon createImageIcon(String path,
                                        String description) {
        java.net.URL imgURL = getClass().getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL, description);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }    
}

Как насчет того, чтобы напечатать значение imgURL в методе createImasgeIcon()?

Abra 23.03.2019 18:03

То, что вы делаете, в основном эквивалентно «давайте посмотрим, существует ли файл /foo/bar/image.png на моем жестком диске. Ура, он существует. Итак, теперь давайте загрузим изображение из http://google.com/foo/bar/image.png. О, почему это не работает?» Файл в вашей файловой системе — это не то же самое, что ресурс, загруженный из пути к классам. Синтаксис другой, места поиска ресурса другие. Прочитайте javadoc Class.getResource(). нет ожидает путь к файлу.

JB Nizet 23.03.2019 18:09

Как вы упаковываете и запускаете это? Если вы хотите прочитать файл из файловой системы, используйте new File(path).toURI().toURL();

Elliott Frisch 23.03.2019 18:09

Если распечатать imgURL, он просто печатает нулевое значение. JB Nizet - Я пробовал и относительный патч, но безуспешно. Не могли бы вы намекнуть, что мне не хватает? Я попытался прочитать javadoc, но дальше ничего не продвинулся. :(

ZedIsDead 23.03.2019 18:22

Он также не ожидает относительного пути к файлу. Если вы хотите загрузить образ из файловой системы, то делайте так, как говорит Эллиотт. Если вы хотите загрузить его из пути к классам, укажите путь, начинающийся с корня пути к классам, как описано в javadoc. Предполагая, что src — это ваш исходный каталог, а ваша IDE копирует изображения в папку классов, путь будет "/img/" + name.

JB Nizet 23.03.2019 18:37

Спасибо JB, я пробовал "/img/" + имя, но безуспешно. Я использую IntelliJ Idea в качестве IDE, не знаю, как проверить, копирует ли он img в путь к классам.

ZedIsDead 23.03.2019 19:00

Вы объявляете bi дважды. Измените ImageIcon bi = new ImageIcon(); на ImageIcon bi ; и, что более важно, ImageIcon bi = createImageIcon(path+name, "Photo"); на bi = createImageIcon(path+name, "Photo");

c0der 24.03.2019 05:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
28
1

Ответы 1

Некоторые незначительные изменения должны исправить ситуацию. Смотрите комментарии:

    public void importPhoto(String name) {

       String path = "/img/" + name;   //use correct path
        URL imgURL = getClass().getResource(path);

        if (imgURL != null){
            System.out.println("yay");
            bi = createImageIcon(imgURL, "Photo"); //avoid declaring a new bi
        } else {
            System.err.println("noo");
        }
    }

    protected ImageIcon createImageIcon(URL imgURL,String description) {

            return new ImageIcon(imgURL, description);
    }

Другие вопросы по теме