我有一个用于绘图的画布。要在画布上画画,我添加了
canvas.addPaintListener(paintEvent-> {
// Misc drawing code here.
});
然后我用
在这个画布上添加一个插入符号Caret c = new Caret(canvas,SWT.None);
c.setBounds(10, 10, 2, 12);
这很好用,我可以在画布上的// Misc绘图代码点画。
但问题出现了: 每次插入符号闪烁时,它都会发送一个绘画事件。这是有道理的,因为我需要重新绘制插入符号下的内容。但它不是仅清除插入符号周围的区域,而是清除整个画布。如果我在paintEvent中查看x,y,width,height,则x和y为0,宽度和高度对应于画布的大小。
那么我如何获得插入符号,只更新它覆盖的区域,而不是整个画布?每次插入符号闪烁时重绘整个画布都有点贵。
添加了: 我使用eclipse开发应用程序。如果我订 在我的应用程序的运行环境中,SWT_GTK3 = 0,每次光标闪烁时应用程序都不会重绘背景。所以它看起来像是一个swt + gtk3问题。
答案 0 :(得分:1)
在创建SWT.NO_BACKGROUND
时设置Canvas
样式,以停止在每个颜料上默认清除画布。
paint事件中的GC
应该设置一个剪切区域,以告诉您需要重新绘制的最小区域:
Rectange clipping = paintEvent.gc.getClipping();
您可以使用它来检查画布的哪些部分需要重新绘制。