2009-09-29 60 views
2

我一直在工作很長時間,一段時間以來我只能描述爲「線程畫布」。一會兒我會描述我所擁有的東西,但由於我真的願意接受新的想法,現有的解決方案或全新的開始,我將制定這個問題。用Java繪製在畫布上的螺紋SWT

畫布旨在顯示遺傳信息(儘管具體目的有點不相關)。作爲傳統的文本編輯器,這種遺傳代碼被繪製到畫布上,用戶可以通過輸入,選擇等與畫布交互。代碼然後進一步用各種非文本特徵(例如形狀,線條和顏色)進行修飾。

這裏的主要問題是需要在顯示某些信息之前進行重要的計算。

考慮以下實體模型:

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

正如你可以看到,遺傳密碼是等寬,但所述酶切口(遺傳密碼如上所示)不是。計算酵素切割的地方非常繁瑣,因爲可能會有很多屏幕顯示特徵(上圖,藍色箭頭)。三字母代碼表示三個遺傳密碼塊的翻譯;雖然這很快執行,但在該序列中輸入單個字母會使它們全部移位 - 需要重新計算。

優選地,爲了加快速度,這些部分中的每一個都可以發生在單獨的線程中,最終一起來組成最終圖像。

總結:顯示器的各個部分在計算上都很困難,儘管編輯器儘可能具有儘可能的響應性。

我現在的實現涉及在單個線程中執行所有繪製事件。通過鍵入,調整大小或進行選擇,可以創建大量線程,但只有最近的線程才能更新顯示。這可以保證更新顯示不會超過一次迭代,但不會提供UI的快速反饋。

我研究過對現有編輯器進行修改,如StyledText,但任何超過某些粗體和顏色的操作都會使其顯着變慢。

有什麼建議嗎?

回答

0

我反而選擇了使用多個緩衝區的解決方案,其中每個緩衝區都在單獨的線程中繪製。性能是很多比StyledText更好,並且我有完全的靈活性來繪製我喜歡的東西。

唯一的缺點是我必須重新實現文本編輯的基礎知識:文本選擇,導航 - 甚至是輸入字符的基礎知識。我對結果滿意。

恐怕我無法提供源代碼,因爲它是版權項目的一部分。

1

可能您最好的選擇是在StyledText中嵌入其他SWT小部件。每個小部件將在後臺線程中執行一定的計算,並在結果進入時更新其可視表示。請注意,您可以在後臺執行計算,但渲染必須發生在SWT線程中。所以在渲染過程中你不能做很多複雜的事情。如果事情變得太慢,請使用緩存圖像(創建一些可以渲染結果的屏幕外圖像,然後簡單地繪製這些圖像)。

Canvas擴展這些小部件,因爲這是用於自定義呈現的小部件。它也可以讓你對不同的事件作出反應(即當用戶停留在酶切時顯示附加信息)。

雖然酶切時要小心:它們的高度各不相同。我建議在默認情況下給這個小部件多一點空間(即使它沒有被使用),這樣在小部件計算並添加剪切時,文本不會跳得太多。

+0

好的見解,亞倫。我將介紹如何將小部件嵌入到StyledText中。至於由於酶而跳動的文本:我不認爲這很可能,因爲這很慢(在大文件中有許多具有正則表達式作爲識別序列的酶)。我認爲給他們一個最小的顯示延遲實際上是一個好主意,這樣在較小的文件中它只會在一兩秒鐘後更新。儘管如此,這確實在細節上。如果我可以將可變大小的小部件放入StyledText,我想我已經到了一半了。 – 2009-09-29 15:34:22

+0

更改小部件的大小應使StyledText自行重新佈局。 – 2009-09-29 15:52:38