我有一个 MyComposite
类,在这里我想动画的大小变化。
为此,我改变了一个循环的大小。
每次我打电话后 layout()
.
不幸的是,复合材料没有ä每次迭代后,我都不会重新绘制,但会直接跳到合成的最终大小。
如何强制小部件在每次大小更改时重新绘制?
mycomposite和动画:
//start
new Animation().start(myComposite);
...
public MyComposite(Composite parent, int style, int bgcolor) {
super(parent, style);
this.setBackground(getDisplay().getSystemColor(bgcolor));
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
return super.computeSize(width, height, changed);
}
class Animation{
public void start(MyComposite composite){
for(int i=0; i<1000; i++){
composite.width++;
composite.getParent().layout(true, true);
}
}
}
复合材料:
2条答案
按热度按时间8i9zcol21#
重画工作如下:
layout()标记强制重新定位所有复合子级。这将成为可见的下一次重画,这将在某处做,在未来,当复合的屏幕区域将被重新绘制
redraw()将小部件标记为无效。在下一次重画系统操作时,此区域将被重新绘制。
update()强制所有未完成的redraw()请求立即完成。
所以问题是,我没有立即触发重新绘制请求。正确的动画函数如下所示:
hi3rlvi22#
我相信你的问题是所有的东西都是在一个显示线程上执行的。因此,代码会快速调用width++和.layout,然后调用结束,显示线程最终有机会实际执行.layout。
我建议查看在自己的线程中运行的java.util.timer,然后使用display.getdefault().asyncexec或.syncexec将这些事件排队返回到显示线程。