首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWT画布无法在Windows上重新绘制,但在Linux上工作

SWT画布无法在Windows上重新绘制,但在Linux上工作
EN

Stack Overflow用户
提问于 2015-07-26 19:59:02
回答 1查看 126关注 0票数 1
代码语言:javascript
复制
this.canvas = new Canvas(shell, SWT.NO_BACKGROUND);

我使用的是PaintListener:

代码语言:javascript
复制
this.canvas.addPaintListener(new PaintListener() {

    @Override
    public void paintControl(PaintEvent e) {
        // Draw images
        synchronized (imageMarks) {
            for (ImageMark mark : Whiteboard.this.imageMarks)
            {
                Image image = Whiteboard.this.getImage(mark.id);
                Point position = ScaledPoint.toSWTPoint(Whiteboard.this.getCanvasSize(), mark.getPosition());
                Point bounds = mark.getUnscaledBoundaries(Whiteboard.this.getCanvasSize());
                e.gc.drawImage(image, 0, 0, image.getBounds().width, image.getBounds().height, position.x, position.y, 
                        bounds.x, bounds.y);
            }
        }

        // Draw pencil marks
        synchronized (pencilMarks) {
            e.gc.setLineWidth(LINE_WIDTH);
            for (double[] line : Whiteboard.this.pencilMarks)
            {
                Point lastPosPoint = ScaledPoint.toSWTPoint(Whiteboard.this.getCanvasSize(), new ScaledPoint(line[0], line[2]));
                Point newPosPoint = ScaledPoint.toSWTPoint(Whiteboard.this.getCanvasSize(), new ScaledPoint(line[1], line[3]));
                e.gc.drawLine(lastPosPoint.x, lastPosPoint.y, newPosPoint.x, newPosPoint.y);
            }
        }

        // Draw pointer, assuming it's there
        if (pointerMark != null)
        {
            synchronized (pointerMark) {
                Point pos = ScaledPoint.toSWTPoint(Whiteboard.this.getCanvasSize(), pointerMark.getPosition());
                if (pointerMark.isFlipped())
                    e.gc.drawImage(Whiteboard.pointerImageFlipped, pos.x, pos.y);
                else
                    e.gc.drawImage(Whiteboard.pointerImage, pos.x, pos.y);
            }
        }
    }
});

并通过canvas.redraw()调用重新绘制画布。在64位Linux上,这似乎没有任何问题,但奇怪的是,在64位Windows上,任何东西都不会被擦除或重新绘制。例如,如果屏幕被调整大小,铅笔标记也不会调整大小,它们最终只会从屏幕上被剪掉。当添加新标记时(换句话说,当再次调用油漆侦听器时),重新定位的标记将重新绘制在没有与窗口进行缩放的旧标记之上。换句话说,我相信canvas.redraw()上没有清除画布。有办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-26 21:02:53

您正在指定SWT.NO_BACKGROUND,它将在每次油漆之前停止清除画布。

如果使用SWT.NO_BACKGROUND,则画布方法的职责是绘制画布的每个像素。

SWT.NO_BACKGROUND JavaDoc:

默认情况下,在小部件绘制之前,工作区将填充当前的背景。当指定此样式时,不填充背景,应用程序负责填充客户区域的每个像素。这种样式可以作为“双缓冲”的替代方案,以减少闪烁。这种风格并不意味着“透明”--被模糊的小部件不会被吸引进来。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31641333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档