Swt插入符导致重绘整个画布

时间:2017-11-22 01:26:34

标签: java swt gtk3

我有一个用于绘图的画布。要在画布上画画,我添加了

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问题。

1 个答案:

答案 0 :(得分:1)

在创建SWT.NO_BACKGROUND时设置Canvas样式,以停止在每个颜料上默认清除画布。

paint事件中的GC应该设置一个剪切区域,以告诉您需要重新绘制的最小区域:

Rectange clipping = paintEvent.gc.getClipping();

您可以使用它来检查画布的哪些部分需要重新绘制。