我是swt的新手,在代码below.when中我点击测试按钮,控制台打印"start“"end”和"in canvas",为什么它不打印"start“"in canvas”"end“。如果这不是问题,我怎么能让控制台在canvas“”end“”.Thanks中打印"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) {
}
});发布于 2015-09-15 20:05:11
我不是swt的高手,但一般来说,如果你做一些像redraw(),repaint(),postInvalidate()或其他类似的调用,在几乎所有的gui框架中,这些调用不会直接重绘内容,它们只是在gui绘制队列中放一条指令,所以它们通常会在你实际调用后的一段时间内执行。因此,在您的代码中,首先完成widgetSelected,然后在GUI线程上执行“重绘”任务。
有时,像在java中,有一个类似的方法,例如在swing中有paintImmidiatelly(),但它只能从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.https://stackoverflow.com/questions/32585352
复制相似问题