Проблемы с перерисовкой при прокрутке с помощью ScrollGraphicalViewer

Окружение: Eclipse Neon на Win10.

У меня есть старое приложение GEF/SWT RCP, которое использует ScrollingGraphicalViewer для обработки прокрутки. При прокрутке исходное изображение, которое должно быть сохранено в прокрутке, перемещается правильно, но новая область не рисуется. Иногда при сворачивании и восстановлении окна приложения оно корректно перерисовывается. хотя в другое время изображение будет отображаться так, как если бы оно не было прокручено, но полоса прокрутки показывает, что оно есть.

Это происходит как с горизонтальной, так и с вертикальной прокруткой. Я тестирую только с прокруткой большого пальца, потому что это один ход, а не непрерывная операция с большим количеством перерисовок.

Вот пример кода. Это метод paintFigure() из одной из моих фигур, который имеет полную ширину.

      защищенная пустота paintFigure (графическая графика)
      {
        if (log.isTraceEnabled ()) {
          окончательная пустышка Rectangle = new Rectangle ();
          log.trace (String.format ("Рисовать цепочку%s, границы%s, клип%s", rungId.getText (), getBounds (), graphics.getClip (dummy))); //$NON-NLS-1$
        }
        super.paintFigure (graphics);

        // Рисуем вертикальные полосы
        Rectangle r = getBounds ().getCopy ();
        r.width -= LINE_WIDTH;
        r.width += 1; // по какой-то причине подхожу к 1 короткому
        r.shrink (маржа, 0);
        if (log.isTraceEnabled ()) {
          log.trace (String.format ("Скорректированные границы%s", r)); //$NON-NLS-1$
        }
        final int connectionY = ry + connectionYOffset;
        int connectionXStart = инструкция Figure.getBounds ().right ();
        int connectionXStop = r.right ();
        graphics.drawLine (соединение XStart, соединение Y, соединение XStop, соединение Y);
        connectionXStart = rx-4;
        connectionXStop = инструкция Figure.getBounds ().x;
        graphics.drawLine (соединение XStart, соединение Y, соединение XStop, соединение Y);

        graphics.setLineWidth (LINE_WIDTH);
        graphics.drawLine (r.getTopRight (), r.getBottomRight ());

        graphics.drawLine (rx - 4, ry, rx - 4, r.y+r.height);
      }

Вот некоторые результаты трассировки. Обратите внимание, что LadderLayer является родительской фигурой для Rung.

Начальное отображение:
TRACE   2018-06-30 10:08:56,289 10099   com.bas.basplc.ui.editors.ladder_editor.figures.LadderLayer [main] Рисовать слой лестницы, ограничивая прямоугольник (0.0, 0.0, 1200.0, 2190.0), обрезать прямоугольник (0.0 0,0, 1070,0, 673,0)
TRACE   2018-06-30 10:08:56,289 10099   com.bas.basplc.ui.editors.ladder_editor.figures.RungFigure  [main] Рисует ступень 0, ограничивает прямоугольник (3.0, 3.0, 1200.0, 384.0), обрезает прямоугольник (3.0 3,0, 1067,0, 384,0)
TRACE   2018-06-30 10:08:56,290 10100   com.bas.basplc.ui.editors.ladder_editor.figures.RungFigure  [main] Скорректированный прямоугольник границ (63.0, 3.0, 1078.0, 384.0)
Не уверен, что здесь нарисовано:
TRACE   2018-06-30 10:08:56,370 10180   com.bas.basplc.ui.editors.ladder_editor.figures.LadderLayer [main] Краска слоя лестницы, границы прямоугольника (0.0, 0.0, 1200.0, 2190.0), клип Rectangle(1047.0 15,0, 23,0, 658,0)
TRACE   2018-06-30 10:08:56,370 10180   com.bas.basplc.ui.editors.ladder_editor.figures.RungFigure  [main] Рисует ступень 0, ограничивает прямоугольник (3.0, 3.0, 1200.0, 384.0), обрезает прямоугольник (1047.0 15,0, 23,0, 372,0)
TRACE   2018-06-30 10:08:56,370 10180   com.bas.basplc.ui.editors.ladder_editor.figures.RungFigure  [main] Скорректированный прямоугольник границ (63.0, 3.0, 1078.0, 384.0)
Прокрутка большого пальца вправо:
TRACE   2018-06-30 10:10:16,244 90054   com.bas.basplc.ui.editors.ladder_editor.figures.LadderLayer [main] Раскрасить слой лестницы, ограничивает прямоугольник (0.0, 0.0, 1200.0, 2190.0), клип Rectangle(940.0 0,0, 130,0, 673,0)
TRACE   2018-06-30 10:10:16,245 90055   com.bas.basplc.ui.editors.ladder_editor.figures.RungFigure  [main] Рисует ступень 0, ограничивает прямоугольник (3.0, 3.0, 1200.0, 384.0), обрезает прямоугольник (940.0 3,0, 130,0, 384,0)
TRACE   2018-06-30 10:10:16,245 90055   com.bas.basplc.ui.editors.ladder_editor.figures.RungFigure  [main] Скорректированный прямоугольник границ (63,0, 3,0, 1078,0, 384,0)
Перерисовать после свертывания / восстановления:
TRACE   2018-06-30 10:11:56,406 190216  com.bas.basplc.ui.editors.ladder_editor.figures.LadderLayer [main] Рисовать слой лестницы, ограничивая прямоугольник (0.0, 0.0, 1200.0, 2190.0), обрезать прямоугольник (0.0 0,0, 1070,0, 673,0)
TRACE   2018-06-30 10:11:56,406 190216  com.bas.basplc.ui.editors.ladder_editor.figures.RungFigure  [main] Рисует ступень 0, ограничивает прямоугольник (3.0, 3.0, 1200.0, 384.0), обрезает прямоугольник (3.0 3,0, 1067,0, 384,0)
TRACE   2018-06-30 10:11:56,407 190217  com.bas.basplc.ui.editors.ladder_editor.figures.RungFigure  [main] Скорректированный прямоугольник границ (63,0, 3,0, 1078,0, 384,0)

Перед прокруткой большого пальца:

После прокрутки большого пальца:

1 ответ

Решено! Я использовал SimpleRootEditPart, Viewport, LayeredPane, Layer, AbstractLayout. Переходя на их версии Freeform, и теперь я могу аккуратно прокручивать.

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