重绘圆圈时,窗口不会被清除;新圈子会添加到现有内容中。
目标是创建三个圆圈,每种颜色一个圆圈。
线程调用移动函数,该函数绘制具有不同半径的圆。
public void run() {
try {
while(true){
box.removeAll();
move();
box.removeAll();
sleep(500);
}
} catch (InterruptedException e) {
}
}
public synchronized void move() {
Graphics g = box.getGraphics();
g.setXORMode(box.getBackground());
x1= one.x + ofset;
y1= one.y + ofset;
System.out.println("My Point ("+ x1 + " , " + y1 +")" );
g.setColor(Color.green);
g.drawOval(pointA.x-(int)distance1, pointA.y-(int)distance1, (int)distance1*2, (int)distance1*2);
g.setColor(Color.blue);
g.drawOval(pointB.x-(int)distance2, pointB.y-(int)distance2, (int)distance2*2, (int)distance2*2);
g.setColor(Color.red);
g.drawOval(pointC.x-(int)distance3, pointC.y-(int)distance3, (int)distance3*2, (int)distance3*2);
g.dispose();
}
答案 0 :(得分:2)
首先,不推荐您的方法。但是,如果您只需要快速而肮脏的修复,则必须在绘制圆圈之前清除面板。
Graphics g = box.getGraphics();
g.clearRect(0, 0, box.getWidth(), box.getHeight()); // this should do it
g.setXORMode(box.getBackground());
答案 1 :(得分:0)
Graphics g = box.getGraphics();
没有。不要使用getGraphics()。使用该Graphics对象进行的任何绘制都只是临时的,并且会在Swing确定需要重新绘制组件时随时删除。
对于自定义绘制,覆盖JPanel的getPreferredSize()方法:
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g); // clears the background
// add your custom painting here
}
另外,不要忘记覆盖面板的getPreferredSize()
方法。有关详细信息,请阅读Custom Painting上的Swing教程中的部分。