0

Image オブジェクトを BufferedImage 上/内部/上に描画してから、その BufferedImage を JPanel に描画する方法を教えてください。

私の問題を説明するための小さなプログラムを用意しました。ImageLoader を伴うパネルを含む単なるフレーム。

画像はコードと同じフォルダーに配置されます。sten Image は、ペイントしただけでは正常にペイントされますが、BufferedImage でペイントしようとするとうまくいきません。これは、プログラムを実行しようとするとわかります。Test オブジェクトを作成するだけで、あとはコンストラクターが行います。

前もって感謝します!

私のコード:

public class Test extends JFrame{

static class ImageLoader {
    public static Image loadImage(String name){
        Image img = null;
        img = Toolkit.getDefaultToolkit().getImage(ImageLoader.class.getResource(name));
        return img;
    }
}

class Panel extends JPanel{

    Image sten;
    BufferedImage bf = new BufferedImage(500,500,BufferedImage.TYPE_INT_RGB);

    public Panel(Image sten){
        super();
        this.sten = sten;
        initBF();
    } 

    private void initBF(){
        Graphics2D g = (Graphics2D) bf.createGraphics();
        g.drawImage(sten, 0,0,this);
    }

    public void paintComponent (Graphics g)
    {
        g.drawImage(bf, 100,100,null);
        g.drawImage(sten, 0,0,null);
        repaint();
    } 
}


public Test(){
    setSize(new Dimension(500, 500));
    setEnabled(true);
    this.setBounds(50, 150, 500, 500);
    setVisible(true);

    Image sten = ImageLoader.loadImage("sten.png");;

    Panel panel = new Panel(sten);
    panel.setBackground(Color.GREEN);
    panel.setSize(500, 500);
    this.add(panel);

    setDefaultCloseOperation(EXIT_ON_CLOSE);

    panel.paintComponent(this.getGraphics());
}

}

4

2 に答える 2

1

問題は、Toolkit.getDefaultToolkit().getImage画像が非同期的にロードされるため、paintComponentが呼び出されたときにロードされないことです。MediaTrackerイメージが読み込まれるまでブロックするには、 a を使用します。

public Image loadImage(String name) {
   Image img = null;
   MediaTracker tracker = new MediaTracker(myPanel); // pass the panel from ctor
   img = Toolkit.getDefaultToolkit().getImage(ImageLoader.class.getResource(name));
   tracker.addImage(img, 0);
   try {
      tracker.waitForID(0);
   } catch (InterruptedException e) {
      e.printStackTrace();
   }

   return img;
}

またははるかに単純です:

img = ImageIO.read(ImageLoader.class.getResource(name)));

これにより、 を使用する必要がなくなりますMediaTracker

いくつかのメモ:

  • 直接呼び出すのではなく、呼び出しpaintComponentて再描画を要求しrepaintます。
  • getGraphicsカスタム ペイントには使用しないでください- これは一時的なGraphics参照を使用します。
  • カスタムGraphics参照を使用する場合は、参照の使用が終了したら必ず呼び出しGraphics#disposeてください。
于 2013-05-24T14:01:15.667 に答える