Jpanel画没有清除

时间:2017-04-05 16:22:11

标签: 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.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)它们将被移除,这就是我的位置我被困了......

1 个答案:

答案 0 :(得分:4)

如果您只想绘制单个形状,则无需使用缓冲图像。这是清除BufferedImage,在BufferedImage上绘制,最后在paintComponent(...)方法中重绘BufferedImage的额外开销。

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

当您有一个保持静态的复杂绘画时,通常只会使用BufferedImage。

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

如果你想绘制多个矩形,我只会使用BufferedImage。您还可以查看Custom Painting Approaches。它将向您展示如何清除BufferedImage。