3

開発中の GUI に画像リソースを表示しようとしていますが、表示するのに苦労しています。java-swing-displaying-images-from-within-a-jarimages-will-not-work-in-a-jar-fileなどのリソースのロードに関する他の質問に遭遇しましたが、それらは機能していません私のため。

私の問題は最初のリンクと同じように見えます.Eclipseから実行すると画像が表示され、Jarsを使用してコマンドラインから実行すると画像が表示されません. ただし、これらの質問に対する解決策では、画像が表示されません。

リソースを取得するためのコードは次のとおりです。

public class R {

    public static final String resourcePackage = "path/to/image/package";

    /**
     * Returns the resource string that refers to the <code>resource</code> file
     * in the <code>path.to.image.package.png</code> package.
     * 
     * @param resource
     *            the file in the <code>png</code> package
     * @return the full resource string
     */
    public static String png(String resource) {
        return String.format("%s/png/%s", resourcePackage, resource);
    }

    public static ResizableIcon resizableIcon(String resource) {
        return ImageWrapperResizableIcon.getIcon(R.class.getClassLoader()
            .getResourceAsStream(resource), new Dimension(48, 48));
    }
}

GUIを生成するときに呼び出します

JCommandButton connect = new JCommandButton(i18ln.getString("ports"),
                R.resizableIcon(R.png("serial-port-32x32.png")));

R.class.getClassLoader().getResourceAsStreamprint ステートメントは、 のインスタンスを返すため、リソースが見つかったことを示しますsun.net.www.protocol.jar.JarURLConnection$JarURLInputStream

私は困惑しています。私はこれを理解しようと何時間も費やしましたが、助けが必要です。何か案は?

参考までに:関係ないと思いますが、GUI にFlamingoを使用しています。

編集:ステファンのリクエストごと

ソース/
    主要/
        ジャバ/
            com.company.project (パッケージ)
                R.java
                MyGui.java
        資力/
            com.company.project (パッケージ)
                .png (パッケージ)
                    シリアルポート-32x32.png
                    (その他の画像)
                .i18ln (パッケージ)
                    MyGui.properties

より多くのコードについては、この質問に非常に役立つ他に何を提供できるかわかりません。リソースを取得するためのすべてのコードと、そのコードの使用方法は上記で提供されています。あなたが探していた特定の何かがありましたか?

アップデート:

Eclipse を使用して Jar を作成し、コマンド ラインから実行すると、イメージ リソースが正しく表示されます。Gradle を使用して Jar を作成すると、画像が表示されません。そのため、Gradle Jar ではなく Eclipse Jar を介して画像リソースに適切にアクセスできるようにする Jar を生成するときに、別の方法で行われていることがあります。この問題に関して、Gradle フォーラムで質問を開きました。

4

5 に答える 5

3

アプリケーションが存在する環境( StandaloneApplicationServer ) に応じて、適切な を使用する必要がありますClassLoader

ユーティリティ クラスを使用できる場合はUtils、次のようなことを試すことができます。

/* Returns a instance of InputStream for the resource */
public static InputStream getResourceAsStream(String resource) 
                                                   throws FileNotFoundException {
    String stripped = resource.startsWith("/")?resource.substring(1):resource;
    InputStream stream = null;
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if (classLoader != null) {
        stream = classLoader.getResourceAsStream(stripped);
    }
    if (stream == null) {
        stream = Utils.class.getResourceAsStream(resource);
    }
    if (stream == null) {
        stream = Utils.class.getClassLoader().getResourceAsStream(stripped);
    }
    if (stream == null) {
        throw new FileNotFoundException("Resource not found: " + resource);
    }
    return stream;
}

用途:

Utils.getResourceAsStream("com/company/project/png/serial-port-32x32.png");
于 2012-05-11T14:34:26.577 に答える
2

ここで、この例HOW TO LOAD IMAGES TO YOUR ECLIPSE PROJECTを試してください。うまくいけば、これがあなたのために物事を説明するでしょう、より多くのステップはこちら

ただし、このJava Docで説明されているように、ClassLoader を使用しないでください。引用には、「すべてのクラス ローダーは、クラス ファイルの検索に似た方法で、最初にシステム リソースとしてリソースを検索します」と記載されています。

于 2012-05-11T14:28:30.730 に答える
1

リソースパッケージを作成し、このクラスと画像をその中に配置します。

public final class Resources {

    public static ImageIcon getImage(String filename) {
        URL resourceUrl = Resources.class.getResource(filename);
        return new ImageIcon(resourceUrl);
    }
}

編集:

私はあなたの構造をMavenとFlamingo(あなたのRクラスを使用して)で再構築しました、そしてそれはこれらの追加で動作します:

変化する:

R.class.getClassLoader().getResourceAsStream(resource);

に:

R.class.getResource("png/"+resource);

ここで説明するように、maven-assemble-pluginを使用してjarをビルドしました。

于 2012-05-11T13:11:52.150 に答える
0
URL imageurl = getClass().getResource("/images/serial-port-32x32.png");//relative path of the image as argument 
Image myPicture = Toolkit.getDefaultToolkit().getImage(imageurl);

この Image 'myPicture' を ImageWrapperResizableIcon.getIcon メソッドの最初の引数として使用します

于 2012-08-21T10:55:16.050 に答える