Java Jpanel油漆未清除

Java Jpanel油漆未清除,java,swing,colors,jframe,jpanel,Java,Swing,Colors,Jframe,Jpanel,我使用的是JPanel,当我点击面板时,我试图在上面画一些矩形。但单击后,我希望显示一个新形状,但要删除上一个形状。我尝试过一些东西,但是之前的形状没有被删除,我不知道为什么 public class Canvas extends JPanel { private BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_ARGB); private Graphics2D graphics = image.

我使用的是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),它们会被删除,这就是我被卡住的地方…

如果您只想绘制单个图形,那么就不需要缓冲图像。这是清除BuffereImage、在BuffereImage上绘制以及最后在paintComponent(…)方法中重新绘制BuffereImage的额外开销

相反,只需在类中创建实例变量(如startX/startY),然后根据这些变量在paintComponent(…)方法中绘制矩形。不需要BuffereImage。这是Swing组件自己绘制的方式。他们只是直接用图形方法作画

BuffereImage通常仅在具有保持静态的复杂绘图时使用

请阅读上Swing教程中的部分,以了解此方法的工作示例


如果你想画多个矩形,我只会使用BuffereImage。你也可以退房。它将向您展示如何清除缓冲区图像。

如果您只想绘制单个形状,则不需要缓冲图像。这是清除BuffereImage、在BuffereImage上绘制以及最后在paintComponent(…)方法中重新绘制BuffereImage的额外开销

相反,只需在类中创建实例变量(如startX/startY),然后根据这些变量在paintComponent(…)方法中绘制矩形。不需要BuffereImage。这是Swing组件自己绘制的方式。他们只是直接用图形方法作画

BuffereImage通常仅在具有保持静态的复杂绘图时使用

请阅读上Swing教程中的部分,以了解此方法的工作示例


如果你想画多个矩形,我只会使用BuffereImage。你也可以退房。它将向您展示如何清除缓冲区图像。

您正在
图像本身上绘制一些东西。面板已清除,但图像上绘制的形状仍保留。哦,我明白了。那你知道我怎样才能清除图像吗?LE:明白了,你必须使用clearRect()你可以用一种颜色(透明度)填充整个图像。你在
图像上画东西。面板已清除,但图像上绘制的形状仍保留。哦,我明白了。那你知道我怎样才能清除图像吗?LE:明白了,你必须使用clearRect()你可以用一种颜色(透明度)填充整个图像。