我正在写一个简单的绘画程序。
我创建了一个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);
}
}
}
答案 0 :(得分:4)
要绘制多个“Rectangle”,“Square”或“Circle”对象,需要将它们添加到集合(例如ArrayList
)并且每次调用paintComponent(Graphics)
,迭代集合画每一个。
或者在BufferedImage
中绘制形状并绘制图像。
..当我绘制越来越多的形状时,这会影响效率吗?因为每次调用repaint();
时,paintComponent都必须绘制许多形状
我可以给出3个答案。他们在这里:
BufferedImage
。这样,无论有多少 ..百万 先前已经渲染到图像,每个新添加的形状都会为图像绘制另外一个形状。..我也需要写一个撤销功能,在这种情况下List也很有用
听起来像列表是这个用例的方法。
答案 1 :(得分:0)
super.paintComponent()最终做的事情之一是JComponent.paintComponent()
,它调用ComponentUI.update()
。 Javadocs说(我添加了斜体字):
“默认情况下,此方法将使用其背景颜色填充指定的组件(如果其opaque属性为true,则为 ),然后立即调用paint。”
因此,请尝试拨打setOpaque(false)
。但是,这通常会导致其他问题,例如当您真正做想要删除之前绘制的内容时。