2013-02-05 54 views
1

我在(比較舊的)應用程序目前修復bug:AWT:計算組件的尺寸立即

它涉及具有延遲加載功能,並具有快速搜索文本字段的樹。假定存在以下情況:

  1. 有人類型在快速搜索文本字段
  2. 這將導致查詢發送到後臺服務器,搜索與輸入的名稱可用的樹節點,並在下降爲他們提供了一個字符串羽絨風格。
  3. 用戶從下拉列表中選擇一個項目。
  4. 展開所選元素路徑中樹中的所有節點,導致延遲加載樹加載...以及一堆節點。
  5. 樹(具有滾動條)滾動,以便所選元素處於視圖中。

第1步到第4步工作得很好,但第5步只有在樹不需要延遲加載元素時纔有效,但是之前已經加載了樹。

經過一段時間的調試後,我發現這是因爲計算出滾動量的代碼使用了表示樹節點的AWT元素的維數。但是,如果這些元素是惰性加載的,則這些維度不會被計算出來,因此代碼無效。我想維度計算將在重繪方法中發生。或者無論如何:太晚了。

如何讓AWT立即計算元件尺寸?

該代碼在AWT之上使用Thinlet

+0

你知道可視樹中的元素至少有多少是以上節點要選擇,並深深它在樹?在延遲加載發生之前可以知道這個嗎?如果不是,那麼AWT不能做魔術。 –

+0

@MikhailVladimirov:不,我在延遲加載之前不知道這一點,但延遲加載代碼是同步的。在執行滾動代碼之前,元素將被完全加載。所有數據都在那裏,但它只是沒有渲染。 – yankee

回答

0

看起來你的問題更多的是在Thinlet方面而不是在AWT方面。它看起來像是Thinlet中的一個錯誤。在進行實際滾動之前,Thinlet會嘗試對要滾動到的節點進行佈局佈局,但是對於節點而言,這並不正確。

使用下面的補丁來獲得thinlet在你的情況下正常工作:

--- Thinlet.java  2005-03-28 18:15:28.000000000 +0200 
+++ Thinlet_new.java 2013-02-06 16:06:23.707530066 +0100 
@@ -166,6 +166,10 @@ 

     private void doLayout(Object component) { 
       String classname = getClass(component); 
+    while ("node" == classname) { 
+     component = getParent(component); 
+     classname = getClass(component); 
+    } 
       if ("combobox" == classname) { 
         if (getBoolean(component, "editable", true)) { 
           Image icon = getIcon(component, "icon", null);