Java 与swt canvas.redraw混淆

Java 与swt canvas.redraw混淆,java,canvas,swt,Java,Canvas,Swt,在下面的代码中,我是swt的新手。当我单击test按钮时,控制台会打印start end和in canvas,为什么不在canvas end中打印start呢。如果这不是问题,我如何让控制台打印从画布开始结束。非常感谢 canvas.addPaintListener新建PaintListener{ @Override public void paintControl(PaintEvent e) { System.out.println("i

在下面的代码中,我是swt的新手。当我单击test按钮时,控制台会打印start end和in canvas,为什么不在canvas end中打印start呢。如果这不是问题,我如何让控制台打印从画布开始结束。非常感谢

canvas.addPaintListener新建PaintListener{

        @Override
        public void paintControl(PaintEvent e) {
            System.out.println("in canvas");
        }
    });
    test.addSelectionListener(new SelectionListener() {

        @Override
        public void widgetSelected(SelectionEvent e) {
            System.out.println("start");
            canvas.redraw();
            System.out.println("end");
        }

        @Override
        public void widgetDefaultSelected(SelectionEvent e) {

        }
    });

我不是swt方面的大师,但一般来说,如果您进行一些调用,如重画、重绘、postInvalidate或其他类似的调用,在几乎所有的gui框架中,这些调用不会直接重画内容,它们只是在gui绘图队列中放一条指令来完成,因此它们通常在实际调用后的一段时间执行首先完成widgetSelected,然后在gui线程上执行重画任务

有时,像java中一样,也有类似的方法,例如在swing中,有paintimimidatelly,但它只能从GUI线程调用,通常情况下,当您在侦听器中获得GUI事件时,这通常是从捕获该事件的GUI线程调用

也许您可以在swt中使用update,强制将其绘制到位

重画工作如下:

redraw() marks the widget an invalidated. On next redraw-system-action this area will be repainted.
update() forces all outstanding redraw() requests to be completed NOW.