我正在使用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);
形状很好地绘制,中心是我点击的地方,但前面的那些没有被删除..我认为通过使用repaint()和super.paintComponent(g)它们将被移除,这就是我的位置我被困了......
答案 0 :(得分:4)
如果您只想绘制单个形状,则无需使用缓冲图像。这是清除BufferedImage,在BufferedImage上绘制,最后在paintComponent(...)方法中重绘BufferedImage的额外开销。
相反,只需在类中创建实例变量(如startX / startY),然后根据这些变量在paintComponent(...)方法中绘制矩形。不需要BufferedImage。这就是Swing组件自己绘制的方式。他们只是使用Graphics方法直接绘画。
当您有一个保持静态的复杂绘画时,通常只会使用BufferedImage。
阅读Custom Paining上Swing教程中的部分,了解此方法的工作示例。
如果你想绘制多个矩形,我只会使用BufferedImage。您还可以查看Custom Painting Approaches。它将向您展示如何清除BufferedImage。