如何在SWT Canvas上保留先前的绘图使用时钟示例

时间:2015-07-30 12:22:58

标签: java canvas swt

现在,我正在阅读Eclipse4插件开发示例,在第一个示例中,画布上的时钟将每隔一秒使用canvas.redrawn()移动,它总是显示一秒钟,现在我想要让画布显示1秒钟,一秒钟后显示2秒钟...... 60秒后它将是60秒钟。 现在,在这段代码中,我使用SWT.NO_BACKGROUND作为新的Canvas而不是SWT.NONE,它在Windows中可以正常,但在Linux上它总是显示一秒钟。

还有其他方法可以保持画布上的前一个绘图不干净,并且可以在同一个画布上绘制新内容。 非常感谢。

public class ClockView extends ViewPart {
    public void createPartControl(Composite parent) {
        final Canvas clock = new Canvas(parent, SWT.NONE);
        clock.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                int seconds = new Date().getSeconds();
                int arc = (15 - seconds) * 6 % 360;
                Color blue = e.display.getSystemColor(SWT.COLOR_BLUE);
                e.gc.setBackground(blue);
                e.gc.fillArc(e.x, e.y, e.width - 1, e.height - 1, arc - 1,
                        2);
                new Thread("TickTock") {
                    public void run() {
                        while (!clock.isDisposed()) {
                            clock.getDisplay().asyncExec(new Runnable() {
                                public void run() {
                                    if (clock != null
                                            && !clock.isDisposed())
                                        clock.redraw();
                                }
                            });
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                return;
                            }
                        }
                    }
                }.start();
            }
        });
    }

1 个答案:

答案 0 :(得分:0)

SWT.NO_BACKGROUND用于通过不重绘背景来减少闪烁,但不保证保留您之前绘制的内容,例如参见this Eclipse bug中的最后一条注释。 SWT.NO_BACKGROUND的确切行为确实因平台而异。

您需要在每个绘画请求上绘制所有内容。