2017-04-05 8 views
0

JPanelを使用しています。パネルをクリックすると、その上に四角形をペイントしようとしています。クリックした後、新しい図形が表示されますが、前の図形は削除されます。私は以前の形が削除されないいくつかのことを試みたが、私は理由を知らない。Jpanelのペイントがクリアされない

public class Canvas extends JPanel { 

private BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB); 
private Graphics2D graphics = image.createGraphics(); 

Canvas() { 

    addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      drawShapeAt(e.getX(), e.getY()); 
      repaint(); 

     } 
    }); 

} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(image,0,0,this); 
} 


public void drawShapeAt(int x, int y) { 

    graphics.setColor(Color.blue); 
    graphics.fill(new RegularPolygon(x, y, 100, 5)); 

} 

}

私も自分のJFrame上でこれを呼び出します。

Canvas mouse=new Canvas(); 
    this.add(mouse, BorderLayout.CENTER); 
    mouse.drawShapeAt(250,250); 

形状がきれいに描かれている)私がクリックした場所、センターがあるが、以前のものはremoved..Iは、(使用して再描画することを考えませんし、super.paintComponent(G)、それらは削除されるだろう、それは私がこだわっている場所です...

+0

あなたは 'image'自体に何かを描いています。パネルは消去されますが、画像に描かれた図形は残ります。 – Titus

+0

ああ、私はそれを得る。それでは、どのようにイメージをクリアすることができますか? LE:入手しました。あなたはclearRect()を使用する必要があります – Gimv30

+0

イメージ全体を単一の色(透明)で塗りつぶすことができます。 – Titus

答えて

4

ただ1つの図形を描画したい場合は、バッファリングされた画像の必要はありません。これは、BufferedImageをクリアし、BufferedImageにペイントし、最後にpaintComponent(...)メソッドでBufferedImageを再描画するための余分なオーバーヘッドです。

代わりに、インスタンス変数をstartX/startYのように作成し、これらの変数に基づいてpaintComponent(...)メソッドで矩形を描画します。 BufferedImageの必要はありません。これはSwingコンポーネントが自身をペイントする方法です。 Graphicsメソッドを使用して直接ペイントします。

通常、BufferedImageは、複雑な絵が静的なままである場合にのみ使用されます。

このアプローチの実際の例については、Custom PainingのSwingチュートリアルのセクションを参照してください。

複数の四角形を描画する場合は、BufferedImageのみを使用します。 Custom Painting Approachesもチェックできます。 BufferedImageをクリアする方法を説明します。

関連する問題