3

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-ingではなく)、次のように使用してみました:

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

これは問題なく機能しますが、Jar に入れようとすると、入りません。なぜこれが起こっているのか理解できないようです。ファイルが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
4

4 に答える 4

3

マルチスレッドアプリケーションに取り組んでいるようです。スタック トレースから、Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid imageUI 以外のスレッドで画像を読み込んでいて、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();
    }
}
于 2012-06-05T12:16:23.000 に答える
0
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も参照してください。

于 2012-06-05T11:29:51.037 に答える
0

これらを試してください- this.getClass().getClassLoader().getResourceAsStream("icon.ico") または this.getClass().getClassLoader().getResourceAsStream("package_or_full_path_to_image/icon.ico" ) または Name_of_THIS_CLASS.class.getClassLoader().getResourceAsStream("icon.ico")

于 2012-06-05T12:10:34.703 に答える
0
  1. クラスファイルと同じディレクトリにファイルを置き、ジャリングせずgetResourceAsStream()にロードしてみましたか?
  2. Jar の内部と外部でjava.security.DigestInputStreamを使用してストリームのチェックサムを取得して、2 つの環境間でファイルが実際に異なるかどうかを確認しましたか?
于 2012-06-05T13:53:40.287 に答える