this.canvas = new Canvas(shell, SWT.NO_BACKGROUND);我使用的是PaintListener:
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()上没有清除画布。有办法解决这个问题吗?
发布于 2015-07-26 21:02:53
您正在指定SWT.NO_BACKGROUND,它将在每次油漆之前停止清除画布。
如果使用SWT.NO_BACKGROUND,则画布方法的职责是绘制画布的每个像素。
SWT.NO_BACKGROUND JavaDoc:
默认情况下,在小部件绘制之前,工作区将填充当前的背景。当指定此样式时,不填充背景,应用程序负责填充客户区域的每个像素。这种样式可以作为“双缓冲”的替代方案,以减少闪烁。这种风格并不意味着“透明”--被模糊的小部件不会被吸引进来。
https://stackoverflow.com/questions/31641333
复制相似问题