Загрузка ImageIcon в Java

1

Я искал документацию Google, SE и Oracle для получения информации о том, как это сделать, но я не могу заставить ее работать.

Я нашел несколько сообщений о том, следует ли использовать getResource() или getResourceAsStream() и как форматировать имя файла, но ни один из них не может применяться к моей ситуации.

Моя структура каталогов выглядит так (с некоторыми дополнительными уровнями в папке ресурса):

Root Folder
|
|_____ bin (compiled .class files go here)
|
|_____ src
|         |
|         |_____ packageA
|         |         |
|         |         |_____ packageAa
|         |                   |
|         |                   |_____ images.java
|         |                   |
|         |                   |_____ resources
|         |                             |
|         |                             |_____ icon1.gif
|         |
|         |_____ packageB
|         |
|         ... (More packages with sub-packages)
|
|_____ resources (should it go here?)
          |
          |_____ icon2.gif

В моей реальной программе у меня есть 107 изображений gif с именами файлов, которые могут быть получены из значений объекта. Эти изображения в настоящее время находятся в обеих папках ресурсов, потому что я играл с ними, чтобы попытаться заставить их работать.

Мой текущий код пытается это сделать:

String imageFileName = getFileName(obj);  // returns a string such as "/resources/cardImages/acespades.gif"
URL imageURL = getClass().getClassLoader().getResource(imageFileName);
ImageIcon icon = new ImageIcon(imageURL);

Я продолжаю получать исключение нулевого указателя, независимо от ведущих обратных косых черт.

Как мне форматировать имя файла и создать объект URL для получения изображений?

Примечание. Я использую Sublime Text 3 с Javatar для компиляции моего кода. Структура папок (папка bin) создается Javatar. Моя "Исходная папка" установлена в src а "корневая папка", указанная выше, - это моя флешка.

================================================== ==
Редактировать:

Я попробовал предложения Питера, и это результаты:

URL imageURL = getClass().getResource("resources/cardImages/back1.gif");
System.out.println(imageURL);
ImageIcon icon = new ImageIcon("resources/cardImages/back1.gif");

Вывод println выводит значение null, но ImageIcon корректно отображает изображение. Я понимаю, что это загружает изображение из папки рядом с файлом.java.

URL imageURL = getClass().getResource("/resources/cardImages/back1.gif");
System.out.println(imageURL);
ImageIcon icon = new ImageIcon("/resources/cardImages/back1.gif");

Println по-прежнему печатает нуль, но теперь изображение не отображается. Я скопировал и вложил всю папку ресурсов, чтобы убедиться, что она идентична в обоих местах.

  • 0
    Как вы начинаете свою программу? Какой классный путь?
  • 0
    Я начинаю урок, используя Javatar. Это страница проекта для справки: javatar.readthedocs.org/en/latest/index.html
Показать ещё 3 комментария
Теги:
swing
imageicon

1 ответ

3
Лучший ответ

При загрузке ресурсов над классом путь относится к пути пакета, если у вас нет ведущей косой черты /.

Что касается вашего icon1.gif, используя

URL url = getClass().getResource("resources/icon1.gif");

должен вернуть правильный URL.

Я рекомендую хранить ресурсы и ресурсы Java отдельно. Если ресурсы являются исходной папкой (выходная папка которой является корнем bin/JAR), используйте:

URL url = getClass().getResource("/icon2.gif");

(обратите внимание на ведущую косую черту).


EDIT (вопрос обновлен):
Исправлен второй URL (ресурсы - это исходная папка, а icon2.gif - в его корне).
Я просто проверил его в Eclipse, и я получил правильные (не нулевые) URL-адреса для обоих вариантов. Использование URL-адресов в ImageIcon также дает правильные результаты, изображения отображаются.

  • Убедитесь, что resources являются исходной папкой. Не все файлы проекта помещаются в папку вывода (обычно bin), а затем JAR.
  • Проверьте свою выходную папку, чтобы убедиться, что она содержит скомпилированные классы, а также ресурсы. Изображение 174551
  • 1
    Итак, получается, что «IDE», которую я использую, неправильно обрабатывает ресурсы. Когда я компилирую свой код, программа создает папку bin на том же уровне, что и исходная папка. Однако он не проверяет ресурсы и не помещает их в папку bin. Когда я скопировал папку resources в bin , все работало как чудо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню