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ファイルにアクセスしていると表示されます)
ありがとうございました。
JARリソースから画像をロードするには、次のコードを使用します。
Toolkit tk = Toolkit.getDefaultToolkit();
URL url = getClass().getResource("path/to/img.png");
Image img = tk.createImage(url);
tk.prepareImage(img, -1, -1, null);
コードに2つの問題があります。
_getClass().getResourceAsStream(imgLocation);
_
これは、画像ファイルが、別のリソースフォルダーではなく、このコードの元のクラスの.classファイルと同じフォルダーにあることを前提としています。代わりにこれを試してください:
_getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation);
_
別の問題:
_byte abyte0[] = new byte[imageStream.available()];
_
メソッドInputStream.available()
はnotストリームの合計バイト数を返します!ブロックせずに使用可能なバイト数を返しますが、これは多くの場合はるかに少なくなります。
ストリームの終わりに達するまで、バイトを一時的なByteArrayOutputStream
にコピーするループを作成する必要があります。または、getResource()
とURLパラメーターを受け取るcreateImage()
メソッドを使用します。
アイコンの使用方法 に関するSwingチュートリアルのセクションでは、URLを作成し、2つのステートメントでアイコンを読み取る方法を示しています。
たとえば、NetBeansプロジェクトでは、srcフォルダにresourcesフォルダを作成します。そこにあなたの画像(jpg、...)を入れてください。
ImageIOまたはToolkit(getResourceを含む)のどちらを使用する場合でも、画像ファイルへのパスに先頭の/を含める必要があります。
Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg"));
setIconImage(image);
このコードがJFrameクラス内にある場合、画像はタイトルバーのアイコンとしてフレームに追加されます。