我有一个用于绘图的 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,宽度和高度对应于 Canvas 的大小。
那么我如何获得插入符号,只更新它覆盖的区域,而不是整个 Canvas ?每次插入符号闪烁时重新绘制整个 Canvas 有点昂贵。
添加: 我使用 eclipse 来开发该应用程序。如果我设置 SWT_GTK3=0 在我的应用程序的运行环境中,应用程序不会在每次光标闪烁时重绘背景。所以看起来像是 swt+gtk3 问题。
最佳答案
在创建 Canvas
时设置 SWT.NO_BACKGROUND
样式,以停止每次绘制时默认清除 Canvas 。
绘制事件中的GC
应该设置一个剪切区域来告诉您需要重新绘制的最小区域:
Rectange clipping = paintEvent.gc.getClipping();
您可以使用它来检查 Canvas 的哪些部分需要重新绘制。
关于java - Swt 插入符会导致整个 Canvas 重绘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47425406/