Я пытаюсь загрузить изображение из файла Jar. Вот линия:Не удалось загрузить картинку из Jar
Image imgTrayIcon = new Image(display, this.getClass().getResourceAsStream("icon.ico"));
Я видел много примеров, используя этот метод, но когда я пытаюсь сделать это, я получаю и ошибка о том, что мое изображение является недействительным. Вот тактика стека:
[java] Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid image
[java] at org.eclipse.swt.SWT.error(SWT.java:4083)
[java] at org.eclipse.swt.SWT.error(SWT.java:3998)
[java] at org.eclipse.swt.SWT.error(SWT.java:3969)
[java] at org.eclipse.swt.internal.image.WinICOFileFormat.loadInfoHeader(WinICOFileFormat.java:200)
[java] at org.eclipse.swt.internal.image.WinICOFileFormat.loadIcon(WinICOFileFormat.java:127)
[java] at org.eclipse.swt.internal.image.WinICOFileFormat.loadFromByteStream(WinICOFileFormat.java:119)
[java] at org.eclipse.swt.internal.image.FileFormat.loadFromStream(FileFormat.java:48)
[java] at org.eclipse.swt.internal.image.FileFormat.load(FileFormat.java:84)
[java] at org.eclipse.swt.graphics.ImageLoader.load(ImageLoader.java:130)
[java] at org.eclipse.swt.graphics.ImageDataLoader.load(ImageDataLoader.java:22)
[java] at org.eclipse.swt.graphics.ImageData.<init>(ImageData.java:331)
[java] at org.eclipse.swt.graphics.Image.<init>(Image.java:545)
[java] at SysTray.run(Unknown Source)
Значок, который я использую, определенно действителен. Я проверил это с помощью инструментов значков. Я также попытался поместить значок в том же каталоге, что и мой код (не Jar-ки его) и использовать его как это:
Image imgTrayIcon = new Image(display, "icon.ico");
Это работает просто отлично, но когда я пытаюсь поставить его в Jar , это не так. Я не могу понять, почему это происходит. Я несжатый мой Jar, чтобы проверить, был ли файл добавлен в Jar, и, похоже, он там. В моей банке нет сложной структуры папок. Все файлы и ресурсы находятся на одном уровне дерева.
Какие-либо идеи о том, что здесь не так? Благодаря
Вот некоторые примеры кода повторить вопрос:
Example.java
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.graphics.*;
class Example {
public static void main(String[] args) {
Display display = Display.getDefault();
Image imgTrayIcon = new Image(display, Example.class.getClassLoader().getResourceAsStream("icon.ico"));
}
}
Команды:
javac -cp "SWT.jar" Example.java
jar cf Example.jar *.class *.ico
java -cp "Example.jar;SWT.jar" Example
Hi Favonius. Кажется, я нашел причину. Кажется, он не имеет ничего общего с потоками и т. Д. Мой значок - это значок с несколькими разрешениями. Я могу использовать этот значок очень хорошо, если загружать его напрямую, но кажется, что загрузка значка с несколькими разрешениями из ресурсов вызывает проблемы. Вы знаете что-нибудь об этом? Я попробовал свой пример, используя простой файл значков, который имел только одно разрешение, и он работал нормально. Вот значок, который я пытался использовать: http://findicons.com/icon/64852/download_box?id=345962. –
Похоже на ошибку в реализации SWT. Код не работает, даже если 'InputStream stream = new FileInputStream (" icon.ico ");'. Постскриптум Проблема заключается в значке с несколькими разрешениями. ** Но ** когда вы делаете 'imgTrayIcon = новое изображение (display," icon.ico ");' тогда SWT вызывает собственный метод ... который, в свою очередь, вызывает собственный API-интерфейс win32 GDI +. Возможно, вы захотите найти SWT-ошибку ... если не смогли найти ни одного рейза! – Favonius