2012-07-28 60 views
1

有很多類似的話題,我在這裏看到,但不能真正找到解決我的小問題。java定製JTree insertnodeinto

我的應用程序正在通過文件進行搜索並在jtree中顯示結果。我有這個問題。當我使用insertNodeInto(...)將新節點添加到樹中時;我可以在搜索時搜索找到的項目,但可視化存在問題。我的意思是渲染節點存在問題 - 我真的無法正確解釋,所以我包含了這個圖像。

enter image description here

當我使用的JTree重裝在尋找一切的結束恢復正常 - 渲染是確定的,不幸的是這將關閉該用戶打開的所有標籤。

我是一名學生 - 抱歉我的英語不好。我希望有人知道爲什麼會出現這個問題。

+1

看起來像模型變化的通知失蹤的地方 - 請出示演示該問題 – kleopatra 2012-07-28 20:10:10

+1

@kleopatra奇怪的是,'insertNodeInto'是'DefaulTreeModel'方法,觸發相應的事件SSCCE。同樣以我的經驗來看,一旦事件搞砸了,除非你發起一切都改變的事件,否則你永遠無法恢復'JTree'。在這種情況下,我不會排除修改錯誤的'Thread'/multiple'Thread'導致錯誤的事件順序 – Robin 2012-07-28 21:06:28

+1

您是否在[EDT]上插入節點(http://docs.oracle.com/javase/tutorial /uiswing/concurrency/dispatch.html)? – tenorsax 2012-07-29 03:51:04

回答

2

您的GUI顯示方式看起來好像是在繪製線程(事件調度線程(EDT))外部添加組件到您的模型。這反過來會觸發此線外的繪畫,這將導致繪畫不穩定。

請看看this tutorial on threads in Swing

看着DefaultTreeModel,很明顯的是,insertNodeInto(..)方法會觸發GUI更新,因此,如果不是在美國東部時間做,你很容易在你的例子中所描繪的繪畫的問題。

速戰速決是添加類似於下面的(未編譯)代碼的方法:

public void safeInsertNodeInto(final MutableTreeNode newChild, 
          final MutableTreeNode parent, final int index) { 
      SwingUtilities.invokeLater(
        new Runnable(){ 
         public void run(){ 
          model.insertNodeInto(newChild,parent,index); 
         } 
        } 
      ); 
} 

然後調用該方法,而不是在你的模型直接調用。

這就是說,我強烈推薦閱讀上面引用的教程。有更多先進的方法來處理EDT限制。