我有一个循环向经理添加字段,我试图延迟每个字段绘制到屏幕之间的时间。我一直在尝试下面的代码,但它只是在所有字段都添加到它时绘制管理器。 这可能吗?
manager.add(field);
manager.invalidate();//force a repaint of the manager
Thread.sleep(1000);
由于
答案 0 :(得分:2)
Invalidate不一定强制绘制,它只是说在下一个绘制时需要重绘Field(或你的情况下的Manager)。这是一个微妙的差异,但它可能导致混乱。您可能想要尝试的是调用Screen.doPaint()
,这将强制整个屏幕重绘。另外,将sleep()放在Event Thread中也无济于事,因为绘制也是在同一个Thread上完成的。
如果您尝试在第二次延迟时将字段顺序添加到Manager,则应将此逻辑放在自己的线程中,并在调用manager.add(字段)时执行synchronized(UiApplication.getEventLock()){//add fields}
。然后,您可以致电Thread.sleep(1000)
以正确延迟显示。此外,正如一些添加的信息一样,调用add()
本身会导致invalidate()调用,因此您无需添加它。这是添加
protected void addDelayedFields() {
Thread t = new Thread( new Runnable() {
public void run() {
for(int i=0;i<SOME_LIMIT;i++) {
synchronized(UiApplication.getEventLock()) {
manager.add(new LabelField(i.toString());
}
try{
Thread.sleep(1000);
}
catch(Exception e){ }
}
}
});
t.start();
}
绘画应该在add()之后进行,但如果没有,你也可以调用yourScreen.doPaint()