Проблемы с перерисовкой при прокрутке с помощью 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, и теперь я могу аккуратно прокручивать.