JLabel は簡単に移動できるため、これはまだ実行可能なオプションであり、JLayeredPane やガラス ペインを使用するなど、それを可能にするトリックがあります。しかし、そうは言っても、JPanel で画像を描画することは難しくありません (そして、Google 検索でその方法が示されたことは間違いありません)。drawImage(...)
重要なのは、JPanel のpaintComponent(...)
メソッド オーバーライドでGraphics のオブジェクトのメソッドを使用して描画することです。
現在のコードと現在の問題について詳細をお知らせいただければ、より適切で具体的なアドバイスを提供できる可能性があります。
編集:投稿されたコードについて:まず、メソッド
内のファイルを読み込まないでください。paintComponent(...)
これにより、GUI の描画が遅くなり、GUI の応答性が低下します。また、再描画が発生するたびに同じ画像ファイルでコードを再読み込みするのはなぜですか? いいえ、代わりにファイルを一度読み込んで Image 変数に保存します。を使って読むといいかもしれませんImageIO.read(...)
。
次に、以前に推奨されたように、ファイルを jar ファイルに移動する必要があります。
編集 2 :
たとえば、次のようなコードを使用します。
ペンギン.java
package myPackage;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Penguin extends JPanel {
private Image image;
public Penguin(String imageResource) throws IOException {
InputStream inStream = getClass().getResourceAsStream(imageResource);
image = ImageIO.read(inStream);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
g.drawImage(image, 0, 0, this);
}
}
}
PenguinApplet.java
package myPackage;
import java.awt.BorderLayout;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
@SuppressWarnings("serial")
public class PenguinApplet extends JApplet {
@Override
public void init() {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createAndShowGui();
}
});
} catch (InterruptedException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public void createAndShowGui() {
String penguinImgResource = "images/MyImage.jpg";
try {
Penguin penguinPanel = new Penguin(penguinImgResource );
getContentPane().add(penguinPanel, BorderLayout.CENTER);
} catch (IOException e) {
e.printStackTrace();
}
}
}
クラスファイルを含むパッケージから離れて、イメージパッケージにイメージを含めることができます。

ここでの重要な質問は、クラス ファイルに関連して画像がどこに保存されているかということです。私の例では、クラス ファイルは myPackage に保持され、イメージは myPackage/images にあるため、相対パスは単にイメージです。そのため、画像フォルダー内の画像はすべて、このパス (ここでは「images/MyImage.jpg」) で参照し、ファイルではなくリソースとして取得する必要があります。