2017-04-05 83 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。