web-dev-qa-db-ja.com

JARファイルのリソースにアクセスする方法は?

Javaツールバー付きのプロジェクトがあり、ツールバーにはアイコンがあります。これらのアイコンはresources /というフォルダーに保存されているため、たとえばパスは「resources /icon1.png」になります。 "。このフォルダは私のsrcディレクトリにあるので、コンパイルされるとフォルダはbin /にコピーされます。

次のコードを使用してリソースにアクセスしています。

    protected AbstractButton makeToolbarButton(String imageName, String actionCommand, String toolTipText,
        String altText, boolean toggleButton) {

    String imgLocation = imageName;
    InputStream imageStream = getClass().getResourceAsStream(imgLocation);

    AbstractButton button;
    if (toggleButton)
        button = new JToggleButton();
    else
        button = new JButton();

    button.setActionCommand(actionCommand);
    button.setToolTipText(toolTipText);
    button.addActionListener(listenerClass);

    if (imageStream != null) { // image found
        try {
            byte abyte0[] = new byte[imageStream.available()];
            imageStream.read(abyte0);

            (button).setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(abyte0)));

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                imageStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } else { // no image found
        (button).setText(altText);
        System.err.println("Resource not found: " + imgLocation);
    }

    return button;
}

(imageNameは「resources/icon1.png」などになります)。これは、Eclipseで実行すると正常に機能します。ただし、実行可能なJARをEclipseからエクスポートすると、アイコンが見つかりません。

JARファイルを開くと、resourcesフォルダーがあります。フォルダの移動、JARファイルの変更など、すべてを試しましたが、アイコンが表示されません。

誰かが私が間違っていることを知っていますか?

(副次的な質問として、JARファイルを処理できるファイルモニターはありますか?パスの問題が発生した場合、通常はFileMonを開いて何が起こっているかを確認しますが、この場合はJARファイルにアクセスしていると表示されます)

ありがとうございました。

16
bcoughlan

JARリソースから画像をロードするには、次のコードを使用します。

Toolkit tk = Toolkit.getDefaultToolkit();
URL url = getClass().getResource("path/to/img.png");
Image img = tk.createImage(url);
tk.prepareImage(img, -1, -1, null);
5
Christian

コードに2つの問題があります。

_getClass().getResourceAsStream(imgLocation);
_

これは、画像ファイルが、別のリソースフォルダーではなく、このコードの元のクラスの.classファイルと同じフォルダーにあることを前提としています。代わりにこれを試してください:

_getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation);
_

別の問題:

_byte abyte0[] = new byte[imageStream.available()];
_

メソッドInputStream.available()notストリームの合計バイト数を返します!ブロックせずに使用可能なバイト数を返しますが、これは多くの場合はるかに少なくなります。

ストリームの終わりに達するまで、バイトを一時的なByteArrayOutputStreamにコピーするループを作成する必要があります。または、getResource()とURLパラメーターを受け取るcreateImage()メソッドを使用します。

11

アイコンの使用方法 に関するSwingチュートリアルのセクションでは、URLを作成し、2つのステートメントでアイコンを読み取る方法を示しています。

4
camickr

たとえば、NetBeansプロジェクトでは、srcフォルダにresourcesフォルダを作成します。そこにあなたの画像(jpg、...)を入れてください。

ImageIOまたはToolkit(getResourceを含む)のどちらを使用する場合でも、画像ファイルへのパスに先頭の/を含める必要があります。

Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg"));
setIconImage(image);

このコードがJFrameクラス内にある場合、画像はタイトルバーのアイコンとしてフレームに追加されます。

0
Alain Demortier