2

私はビデオ ゲームを作成しています。画像を JPanel に追加し、その JPanel を JFrame に追加する必要があります。私が見たすべてのチュートリアルでは、それを JLabel に追加するように言われていますが、画像は移動できる必要があります。あなたが JLabel を動かせない限り、私にはそれができません。JPanel に画像を直接追加するにはどうすればよいでしょうか。これは私がこれまでに持っているものですが、JApplet にあったようなものです

class Penguin extends JPanel {

    public Image image;

    public void paintComponent( Graphics g ) {

        image = getImage( getDocumentBase(), "Penguins.jpg" );
        g.drawImage( image, 0, 0, this );
    }
}
4

1 に答える 1

4

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」) で参照し、ファイルではなくリソースとして取得する必要があります。

于 2012-06-29T21:08:56.407 に答える