在Java SWT中将线程绘制到画布上

时间:2009-09-29 14:56:07

标签: java editor multithreading canvas swt

我已经做了很多关于我现在只能描述为“线程画布”的东西了。在片刻我会描述我拥有的东西,但由于我对新想法,现有解决方案或一个全新的开始非常开放,我将制定问题。

画布旨在显示遗传信息(尽管具体目的有些不相关)。作为传统的文本编辑器,该遗传密码被绘制到画布上,用户可以通过键入,选择等与其进行交互。然后,代码被进一步用各种非文本特征(例如形状,线条和颜色)进行装饰。

这里的主要问题是在显示某些信息之前需要进行重要的计算。

考虑以下模型:

Sample of canvas http://img23.imageshack.us/img23/9931/canvasgv.png

如您所见,遗传密码是等宽的,但酶切(遗传密码上方显示)则不然。计算酶切的位置很繁琐,可以显示特征(上图,蓝色箭头),因为屏幕上可能有很多。三字母代码表示三块遗传密码的翻译;尽管执行速度很快,但在序列中键入一个字母会使它们全部移位 - 需要重新计算。

最好是为了加快速度,这些部分中的每一部分都可以在一个单独的线程中出现,最后聚集在一起构成最终图像。

总结:显示器的各个部分在计算上都很困难,尽管编辑器当然希望尽可能地响应。

我目前的实现涉及在各个线程中执行所有绘制事件。通过键入,调整大小或进行选择,可以创建大量线程,但只有最新的线程才会更新显示。这可以保证更新显示不会超过一次迭代,但不会提供UI的快速反馈。

我已经考虑过对StyledText等现有编辑器进行修改,但除了粗体和颜色之外的任何内容都会让它变得非常慢。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

可能你最好的办法是在StyledText中嵌入其他SWT小部件。每个小部件将在后台线程中执行某个计算,并在结果进入时更新其可视化表示。请注意,您可以在后台进行计算,但渲染必须在SWT线程中进行。所以在渲染过程中你不能做很多复杂的事情。如果事情变得太慢,请使用缓存图像(创建一些离屏图像,您可以在其中渲染结果,然后只绘制这些图像)。

Canvas扩展这些小部件,因为这是用于自定义呈现的小部件。它还允许您对不同事件做出反应(即当用户将鼠标悬停在酶切片上时显示其他信息)。

注意酶切:小心高度不同。我建议默认情况下给这个小部件增加一些空间(即使没有使用它),所以当小部件计算并添加切割时,文本不会跳过很多。

答案 1 :(得分:0)

我改为选择使用多个缓冲区的解决方案,其中每个缓冲区都在一个单独的线程中绘制。性能很多比StyledText更好,我可以完全灵活地在我喜欢的地方画画。

唯一的缺点是我必须重新实现文本编辑的基础知识:文本选择,导航 - 甚至是输入字符的基础知识。但我对结果感到满意。

我担心我无法提供源代码,因为它是受版权保护的项目的一部分。