Как получить доступ к изображению из JAR - PullRequest
1 голос
/ 04 марта 2010

Я знаю, что этот вопрос (или подобные) задавался ранее, но я все еще не понимаю его. Я создал банку, которая имеет следующую внутреннюю структуру:

JAR-файл

-конфигурация

--- codeBehind

--- CommandLine

--- гуй

--- ресурсы

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

ImageIcon icon = new ImageIcon(getClass().getResource("settings.png"));
setIconImage(icon.getImage());

но выдает NullPointerException, когда я пытался получить доступ к изображению иконки. Я попытался отделить части команды, и getResources("mypic.png") вернул ноль.

Есть идеи, как мне это получить? Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 04 марта 2010

С документация класса :

Перед делегированием абсолютное имя ресурса строится из данного имени ресурса с использованием этого алгоритма:

  • Если имя начинается с '/' ('\ u002f'), то абсолютное имя ресурса является частью имени, следующей за '/'.

  • В противном случае абсолютное имя имеет следующую форму: modified_package_name / имя

Где имя_моделированного_пакета - это имя пакета этого объекта с заменой '/' на '.' ( '\ U002e').

Так что вы, вероятно, хотите

getResource("/settings.png")

или

getResource("/resources/settings.png")

или что-то подобное, в зависимости от вашего пути к классу, я полагаю.

0 голосов
/ 04 марта 2010

Если вы не хотите связываться с classpath и в любом случае, в любом случае существует избыточный, но на 100% надежный метод, который работает на основе двух следующих фактов:

  • всегда можно найти, где находится .jar , из которого был загружен ваш класс (класс)

  • a .jar - это просто zip-файл, а в Java есть API по умолчанию, позволяющий читать zip-файлы.

Это излишне, но оно «просто работает [TM]» (и из-за различных гарантий, данных Java, оно не может работать: вы можете всегда найти путь к .jar и всегда читать из этого .jar ) и удобно, когда вы хотите создать уникальный .jar , который можно запускать как есть в Windows, OS X, Linux и т. д.

Мы используем этот метод overkill в приложении, которое развернуто на сотнях различных систем.

0 голосов
/ 04 марта 2010

getClass (). GetResource () будет искать ресурс с указанным именем, начиная с (относительно) пакета, для которого вызывается класс, для которого вы вызываете getClass ().

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

...