paintComponent删除以前绘制的组件

时间:2011-12-24 05:17:31

标签: java swing paintcomponent

我正在写一个简单的绘画程序。 我创建了一个JPanel,并且写了“public void paintComponent(Graphics g)”,我还创建了相应的Listeners。问题是,每次我画一个新的形状,我的前一个消失了,有谁知道我怎么能保持以前的形状在他们的位置?我可以取消super.paintComponent(g),但Jpanel's layout会被扭曲。 任何建议都非常感谢。 :) 这是我的paintComponent方法:

public void paintComponent(Graphics g)
{
    super.paintComponent(g);


    int width = xend-xstart;
    int height = yend - ystart;
    if(width<0)
        width *= -1;
    if(height <0)
        height *= -1;
    if(color!= null && shape !=null){
    if(fill.isSelected())
    {
        g.setColor(color);
        if(shape.equals("Rectangle"))
            g.fillRect(xstart, ystart, width, height);
        if(shape.equals("Square"))
            g.fillRect(xstart, ystart, width, width);
        if(shape.equals("Circle"))
            g.fillOval(xstart,ystart,width ,width);

    }
    }

} 

2 个答案:

答案 0 :(得分:4)

要绘制多个“Rectangle”,“Square”或“Circle”对象,需要将它们添加到集合(例如ArrayList‌)并且每次调用paintComponent(Graphics),迭代集合画每一个。

或者在BufferedImage中绘制形状并绘制图像。

  

..当我绘制越来越多的形状时,这会影响效率吗?因为每次调用repaint();

时,paintComponent都必须绘制许多形状

我可以给出3个答案。他们在这里:

  1. 是的。
  2. 但不,在造成明显减速之前,必须有数千
  3. 如果性能有问题。使用BufferedImage。这样,无论有多少 ..百万 先前已经渲染到图像,每个新添加的形状都会为图像绘制另外一个形状。
  4.   

    ..我也需要写一个撤销功能,在这种情况下List也很有用

    听起来像列表是这个用例的方法。

答案 1 :(得分:0)

安德鲁汤普森的回答是做你想做的事情的“典型”方式。但是,如果你想深入了解Swing的深度......

super.paintComponent()最终做的事情之一是JComponent.paintComponent(),它调用ComponentUI.update()。 Javadocs说(我添加了斜体字):

“默认情况下,此方法将使用其背景颜色填充指定的组件(如果其opaque属性为true,则为 ),然后立即调用paint。”

因此,请尝试拨打setOpaque(false)。但是,这通常会导致其他问题,例如当您真正想要删除之前绘制的内容时。