2017-04-05 82 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

你正在'圖像'本身上繪製的東西。該面板被清除,但圖像上繪製的形狀仍然存在。 – Titus

+0

噢,我明白了。那麼你有什麼想法如何清除圖像? LE:明白了,您必須使用clearRect() – Gimv30

+0

您可以用一種顏色(透明度)填充整個圖像。 – Titus

回答

4

如果你只想繪製一個形狀,那麼就不需要緩衝圖像。這是額外的開銷,用於清除BufferedImage,在BufferedImage上繪製,最後在paintComponent(...)方法中重新繪製BufferedImage。

相反,只需在您的類中創建實例變量(如startX/startY),然後在基於這些變量的paintComponent(...)方法中繪製矩形。不需要BufferedImage。這是Swing組件自己繪製的方式。他們直接使用Graphics方法進行繪製。

只有在複雜繪畫保持靜態時纔會使用BufferedImage。

閱讀Swing教程Custom Paining中的部分,以獲得此方法的工作示例。

我只會使用BufferedImage,如果你想繪製多個矩形。您也可以查看Custom Painting Approaches。它會告訴你如何清除BufferedImage。