display.async和平滑过渡

时间:2012-11-03 22:27:52

标签: java multithreading swt

我的自定义小部件在悬停时会更改背景。它工作得很好,但我想在没有背景和悬停背景之间平滑过渡。它适用于GC.setAlpha(),但是:

Display.getDefault().asyncExec(new Runnable() {
    public void run() {
        for (int i=0;i<255;i++) {
            setBG(BGHelper(imgHover,i)); //i - alpha
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }   
});

此代码等到i == 255,但它不会显示平滑过渡。为什么呢?

1 个答案:

答案 0 :(得分:3)

这不起作用,因为只要你在你的代码中,SWT就不会重新绘制或更改组件。

您应该在单独的线程中完成工作,并在每次更改时调用Display.asyncExec

for (int i = 0; i < 255; i++) {
    final int x = i;
    Display.getDefault().asyncExec(new Runnable() {
        public void run() {
            setBG(BGHelper(imgHover,x)); //x - alpha
        }
    });
    try {
        Thread.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}