Swt 插入符导致重绘整个 canvas

Swt caret causes redraw of the entire canvas

我有一个 Canvas 用来画画。为了利用 canvas 我添加了

canvas.addPaintListener(paintEvent-> {
    // Misc drawing code here.
});

然后我用

向 canvas 添加一个插入符
Caret c = new Caret(canvas,SWT.None);
c.setBounds(10, 10, 2, 12);

这很好用,我可以在此处的 // Misc 绘图代码点的 canvas 上绘图。

但是问题来了: 每次插入符号闪烁时,它都会发送一个绘制事件。这是有道理的,因为我需要重新绘制插入符号下的内容。但它不是只清除插入符号周围的区域,而是清除整个 canvas。而如果我在paintEvent中查看x,y,width,height,那么x和y都是0,而width和height对应的是canvas.

的大小

那么如何获取插入符,只更新它覆盖的区域,而不是整个 canvas?每次插入符号闪烁时重新绘制整个 canvas 有点贵。

添加: 我使用 Eclipse 来开发应用程序。如果我设置 SWT_GTK3=0 在我的应用程序的 运行 环境中,应用程序不会在每次光标闪烁时重新绘制背景。所以它看起来像一个 swt+gtk3 问题。

在创建 Canvas 时设置 SWT.NO_BACKGROUND 样式以停止默认清除每个绘画上的 canvas。

paint事件中的GC应该有一个裁剪区域设置告诉你需要重绘的最小区域:

Rectange clipping = paintEvent.gc.getClipping();

您可以使用它来检查 canvas 的哪些部分需要重绘。