Я искал документацию 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 по-прежнему печатает нуль, но теперь изображение не отображается. Я скопировал и вложил всю папку ресурсов, чтобы убедиться, что она идентична в обоих местах.
При загрузке ресурсов над классом путь относится к пути пакета, если у вас нет ведущей косой черты /.
Что касается вашего 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.bin
на том же уровне, что и исходная папка. Однако он не проверяет ресурсы и не помещает их в папку bin. Когда я скопировал папку resources
в bin
, все работало как чудо