java - Swt 插入符会导致整个 Canvas 重绘

标签 java swt gtk3

我有一个用于绘图的 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/

相关文章:

java - 如何使用 Jackcess 在 Java 中检查电子邮件地址和密码?

java - 使合成在 SWT 中可聚焦

python - 如何让 python 识别/找到 Homebrew 软件安装的 gi.repository (PyGObjects)?

python - Gtk.ProgressBar 在 Python 中不起作用

java - mongodb java $in 使用 $regex 查询

java - 用于管理(身份验证/订阅更改)用户的 OPSS

java - 反转单链表?

java - onClick Eclipse 按钮

java - SWT Shell - 内部填充/边框

python - 设置 Gtk3 MenuItem 的悬停背景颜色