Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从Jar加载图像_Java_Image_Jar_Swt - Fatal编程技术网

Java 无法从Jar加载图像

Java 无法从Jar加载图像,java,image,jar,swt,Java,Image,Jar,Swt,我正在尝试从Jar文件加载图像。这是一句话: Image imgTrayIcon = new Image(display, this.getClass().getResourceAsStream("icon.ico")); 我见过很多使用这种方法的例子,但当我尝试这样做时,我得到一个错误,说我的图像无效。以下是堆栈跟踪: [java] Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid image [ja

我正在尝试从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,以检查文件是否被添加到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
通常,您可以通过以下方式检索InputStream:

InputStream is = this.getClass().getClassLoader()    .getResourceAsStream("yourpackage/mypackage/myfile.xml");
它将在罐子内部或外部运行

提及

另请参考以下内容
this.getClass().getClassLoader().getResourceAsStream(“icon.ico”)
this.getClass().getClassLoader().getResourceAsStream(“包\或\完整\路径\到\图像/icon.ico”
)

Name\u这个类。CLASS.getClassLoader().getResourceAsStream(“icon.ico”)

看起来您正在处理多线程应用程序。 从线程“thread-0”org.eclipse.swt.swt异常:无效图像的堆栈跟踪
中,似乎您正在非ui线程中加载图像,并试图在某些ui元素中使用该图像

在UI线程中,下面的代码可以正常工作。(图标文件位于
测试包中

  • 您是否尝试过将该文件与类文件放在同一目录中,而不使用jar,并使用
    getResourceAsStream()
    加载它
  • 您是否尝试过在Jar内部和外部使用while获取流的校验和,以查看文件在这两个环境之间是否存在任何差异

  • 它似乎不起作用。如果我尝试加载一个
    图像图标
    ,它会工作,也就是说,我看不到任何错误。我有一个SWT应用程序,不使用Swing小部件。它只是一个重要的例子,是指定getClass()的方法。getResource(“yourpackage/mypackage/image.gif”)是的,我理解这一点,但我的Jar中没有任何包结构。所有文件都在同一级别上,因此我是这样引用它的:
    this.getClass().getClassLoader().getResourceAsStream(“icon.ico”)。我已经通过运行
    jartf
    检查了Jar中是否存在该文件。尽管如此,我还是遇到了同样的错误。我在帖子中添加了一些示例代码来说明我正在做什么。尝试在映像名称之前添加jar应用程序名称,因为我已经创建了sampleapplication,并通过插入一个映像创建了jar。映像的文件夹结构是sampleapplication/myimage.icoHi Favonius。我想我找到了原因。它似乎与线程等无关。我的图标是一个多分辨率图标。如果直接加载,我可以很好地使用这个图标,但是从参考资料中加载多分辨率图标似乎会导致问题。你知道这件事吗?我使用一个简单的图标文件尝试了我的示例,该文件只有一个分辨率,效果很好。这是我试图使用的图标:。似乎是SWT实现中的一个bug。即使
    InputStream=newfileinputstream(“icon.ico”)。另外,问题在于多分辨率图标。但当您执行
    imgTrayIcon=新图像(显示“icon.ico”)然后SWT调用本机方法。。。它反过来调用本机win32 GDI+API。您可能希望查找SWT错误。。。如果找不到,那就挑一个!!
    
    ImageIcon image = (new ImageIcon(getClass().getResource("yourpackage/mypackage/image.gif")));
    
    InputStream is = this.getClass().getClassLoader()    .getResourceAsStream("yourpackage/mypackage/myfile.xml");
    
    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();
        }
    }