ImageIcon не находит фотографию, путь указан правильно

#java #swing #resources #imageicon

#java #качать #Ресурсы #imageicon

Вопрос:

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

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

 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;
        }
    }    
}
  

Комментарии:

1. Как насчет печати значения imgURL в методе createImasgeIcon() ?

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

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

4. При распечатке imgURL он просто выводит нулевое значение. JB Nizet — я также пробовал относительный патч, но безуспешно. Не могли бы вы, пожалуйста, подсказать, чего мне не хватает? Я попытался прочитать javadoc, но дальше ничего не продвинулся. 🙁

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

Ответ №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);
    }