我正在模拟在连接节点图上行走的人。为了直观地显示它,我使用了画布对象。我首先通过它的节点和它们之间的链接来渲染图形,然后我开始绘制由在图形中移动的小方块表示的人。
我的问题是,在我绘制地图(或图表)后,人的动画会删除标签,有时还会删除图表的线条。我知道这是因为我在包含地图的同一画布上渲染了人的运动(并且因为clearRect()
方法调用)。
我怎样才能避免清除图表?,起初我看着JLayeredPane
但画布重叠并且在最上面的画布上没有透明度(没有透明的人)。我想到的第二个选项是在绘制人之前复制该区域,然后在人移动时恢复该区域,但我不知道如何实现这一点,所以我没有使用过swing
或awt
没有太多使用过的指导,因此不胜感激我认为这可能是一个普遍的问题。
我附上了一张图片来显示我的问题和每个人的渲染代码
public class Person extends Thread {
public Person(String name, Spot location, World world, Graphics g) {
this.name= name;
this.location= location;
this.world= world;
this.g= g;
}
private void move() {
Set<Link> links= world.getLinksFrom(location.getId());
Link route= CollectionUtil.getRandomElement(links);
Spot destination= route.getOriginX() == location.getX() &&
route.getOriginY() == location.getY() ?
route.getTheTarget(): route.getTheOrigin();
try {
double deltaX= (destination.getX() - location.getX()) / route.distance();
double deltaY= (destination.getY() - location.getY()) / route.distance();
double w2= (PERSON_WIDTH / 2);
for(double i=location.getX(), j=location.getY(), d= route.distance();
d > 5;
i+=deltaX, j+= deltaY,
d=Point2D.distance(i, j, destination.getX(), destination.getY())) {
g.clearRect((int)(i - w2 - deltaX), (int)(j - w2 - deltaY),
PERSON_WIDTH, PERSON_WIDTH);
g.drawRect((int)(i-w2), (int)(j-w2),
PERSON_WIDTH-1, PERSON_WIDTH-1);
Thread.sleep(50);
}
this.location= destination;
// Stay ath the new location for a while
Thread.sleep(new Random(System.currentTimeMillis()).nextInt(Person.MAX_SPOT_MILLIS));
} catch(InterruptedException e) {
throw new RuntimeException(e);
}
@Override
public void run() {
while(!isInterrupted()) {
this.move();
}
}
}