【发布时间】:2018-12-09 13:44:31
【问题描述】:
环境:Win10 上的 Eclipse Neon。
我有一个较旧的 GEF/SWT RCP 应用程序,它使用 ScrollingGraphicalViewer 来处理滚动。当我滚动时,应该保留在滚动中的原始图像被正确移动,但没有绘制新区域。 有时,最小化和恢复应用程序窗口可以使其正确重绘。虽然在其他时候,它会显示图像好像没有滚动,但滚动条表明它已经滚动了。
水平和垂直滚动都会发生这种情况。我只测试拇指滚动,因为它是一个单一的动作,而不是一个连续的操作,需要大量的重绘。
这是一个代码示例。这是我的一个人物中的 paintFigure() 方法,它是全宽的。
protected void paintFigure(图形图形) { if (log.isTraceEnabled ()) { final Rectangle dummy = new Rectangle (); log.trace (String.format ("画梯级 %s, 边界 %s, 剪辑 %s", rungId.getText (), getBounds (), graphics.getClip (dummy))); //$非NLS-1$ } super.paintFigure(图形); // 绘制竖线 矩形 r = getBounds().getCopy(); r.width -= LINE_WIDTH; r.宽度 += 1; // 由于某种原因出现 1 个空头 r.shrink (MARGIN, 0); if (log.isTraceEnabled ()) { log.trace (String.format ("调整边界 %s", r)); //$非NLS-1$ } final int connectionY = r.y + connectionYOffset; int connectionXStart = instructionsFigure.getBounds().right(); int connectionXStop = r.right (); graphics.drawLine (connectionXStart, connectionY, connectionXStop, connectionY); 连接XStart = r.x-4; connectionXStop = 指令Figure.getBounds().x; graphics.drawLine (connectionXStart, connectionY, connectionXStop, connectionY); graphics.setLineWidth (LINE_WIDTH); graphics.drawLine (r.getTopRight (), r.getBottomRight ()); graphics.drawLine (r.x - 4, r.y, r.x - 4, r.y+r.height); }这是一些跟踪输出。请注意,LadderLayer 是梯级的父图形。
初始显示: 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),剪辑矩形(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),剪辑矩形(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)【问题讨论】:
-
在检测到任何滚动或调整大小事件时尝试调用图形的 repaint() 方法,然后显式调用
-
这可能是一种解决方法。有几个问题。首先,这都是由 Eclipse 驱动的,我什至不确定如何拦截该事件。其次,我可能有几十个甚至几百个数字,并且执行 redraw() 会很慢——这在快速滚动期间会是一个大问题。
标签: swt eclipse-rcp eclipse-gef