SWT Canvas не удается перерисовать в Windows, но работает в Linux
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(). Есть ли обходной путь для этого?
1 ответ
Вы указываете SWT.NO_BACKGROUND, который останавливает очистку холста перед каждой краской.
Если вы используете SWT.NO_BACKGROUND, ваш метод рисования отвечает за рисование каждого пикселя холста.
SWT.NO_BACKGROUND JavaDoc:
По умолчанию, перед тем, как виджет закрасит, область клиента заполняется текущим фоном. Когда указан этот стиль, фон не заполняется, и приложение отвечает за заполнение каждого пикселя клиентской области. Этот стиль может использоваться в качестве альтернативы "двойной буферизации" для уменьшения мерцания. Этот стиль не означает "прозрачный" - скрытые виджеты не будут прорисовываться.