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:

По умолчанию, перед тем, как виджет закрасит, область клиента заполняется текущим фоном. Когда указан этот стиль, фон не заполняется, и приложение отвечает за заполнение каждого пикселя клиентской области. Этот стиль может использоваться в качестве альтернативы "двойной буферизации" для уменьшения мерцания. Этот стиль не означает "прозрачный" - скрытые виджеты не будут прорисовываться.

Другие вопросы по тегам