调整动画大小每次布局更改后如何重新绘制?

qmelpv7a  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(365)

我有一个 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);
            }
        }
    }

复合材料:

8i9zcol2

8i9zcol21#

重画工作如下:
layout()标记强制重新定位所有复合子级。这将成为可见的下一次重画,这将在某处做,在未来,当复合的屏幕区域将被重新绘制
redraw()将小部件标记为无效。在下一次重画系统操作时,此区域将被重新绘制。
update()强制所有未完成的redraw()请求立即完成。
所以问题是,我没有立即触发重新绘制请求。正确的动画函数如下所示:

//layout of the composite doesn't work
//composite.layout(true, true);

//layout of parent works
composite.getParent().layout(true, true);

//marks the composite's screen are as invalidates, which will force a 
composite.redraw(); redraw on next paint request 

//tells the application to do all outstanding paint requests immediately
composite.update();
hi3rlvi2

hi3rlvi22#

我相信你的问题是所有的东西都是在一个显示线程上执行的。因此,代码会快速调用width++和.layout,然后调用结束,显示线程最终有机会实际执行.layout。
我建议查看在自己的线程中运行的java.util.timer,然后使用display.getdefault().asyncexec或.syncexec将这些事件排队返回到显示线程。

相关问题