当前位置: 代码迷 >> java >> 如何使用时钟示例保持先前在SWT Canvas上绘制
  详细解决方案

如何使用时钟示例保持先前在SWT Canvas上绘制

热度:77   发布时间:2023-07-17 20:39:10.0

现在,我正在阅读《 Eclipse4 PlugIn Development By Example》这本书,在第一个示例中,画布上的时钟将每隔一秒钟通过使用canvas.redrawn()进行移动,它始终显示一秒钟的时钟,现在我想让画布显示1秒的时钟,然后显示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();
            }
        });
    }

SWT.NO_BACKGROUND用于通过不重绘背景来减少闪烁,但不能保证保留您之前绘制的内容,例如,请参阅的最后一个注释。 SWT.NO_BACKGROUND的确切行为在平台之间确实有所不同。

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