无法从罐加载图像(Unable to load image from Jar)

2019-09-17 19:08发布

我试图从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)

我使用的图标肯定是有效的。 我检查了这一点使用图标的工具。 我也试着放置在同一个目录的图标为我的代码(不是瓶子-ING它),并使用它像这样:

Image imgTrayIcon = new Image(display, "icon.ico");

这一切正常,但是当我试图把它的罐,它没有。 我似乎无法找出为什么发生这种情况。 我未压缩我的罐来检查文件是否被添加到罐,它似乎在那里。 我的罐子不具有任何复杂的文件夹结构。 所有的文件和资源都在树的同一水平。

什么这里是错的任何想法? 谢谢


下面是一些示例代码复制的问题:

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

Answer 1:

好像你工作的多线程应用程序。 从堆栈跟踪Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid image似乎正在加载的图像中的非UI线程,并试图利用在某些UI元素。 看到这个 。

在一个UI线程下面的代码工作正常。 (该图标的文件是内部test package

package test;

import java.io.InputStream;

import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class IconTest 
{
    public static void main(String[] args)
    {
        final Display display = new Display();

        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        shell.setSize(200, 200);
        shell.setLocation(20, 20);

        InputStream stream = IconTest.class.getResourceAsStream("/test/icon.ico"); 

        Image imgTrayIcon = new Image(display, stream);

        shell.setImage(imgTrayIcon);

        shell.open();
        while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                        display.sleep();
        }

        if(imgTrayIcon != null)
            imgTrayIcon.dispose();

        display.dispose();
    }
}


Answer 2:

ImageIcon image = (new ImageIcon(getClass().getResource("yourpackage/mypackage/image.gif")));

在一般情况下,您可以检索通过以下方式的InputStream:

InputStream is = this.getClass().getClassLoader()    .getResourceAsStream("yourpackage/mypackage/myfile.xml");

它将内部或外部的罐子运行。

参考http://www.jugpadova.it/articles/2006/02/05/accessing-a-resource-within-a-jar

还指http://docs.oracle.com/javase/tutorial/uiswing/components/icon.html



Answer 3:

试试这些- this.getClass().getClassLoader().getResourceAsStream("icon.ico") OR this.getClass().getClassLoader().getResourceAsStream("package_or_full_path_to_image/icon.ico" ) OR Name_of_THIS_CLASS.class.getClassLoader().getResourceAsStream("icon.ico")



Answer 4:

  1. 你有没有试过把文件在同一目录下的类文件,没有JARING它,并且使用getResourceAsStream()来加载它?
  2. 您是否尝试过让使用流的校验java.security.DigestInputStream中 ,而内部和外部的Jar的,看看文件中的两个环境之间的任何实际的方式不同?


文章来源: Unable to load image from Jar
标签: java image jar swt