2010-09-29 125 views
8

我在我的GUI中使用了JTree並將其添加到JFrame中。當我想更新它並在程序的另一部分中更改它的節點時(程序運行時,執行操作時),我嘗試添加新節點或刪除節點;但我的界面不會改變。請給我一個解決方案。在Java GUI中更新JTree

問候

回答

15

除了insertNodeInto建議你也可以使用:

DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); 
DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); 
root.add(new DefaultMutableTreeNode("another_child")); 
model.reload(root); 
+1

非常感謝您的寶貴回答!每次我想更新我的樹,我使用這種方法。 – sajad 2010-09-30 12:42:16

+3

這會起作用,但在處理大樹時是一種「強力」方法。例如,如果我要循環並將1000個節點添加到已包含50,000個項目的樹中,則效率非常低。 – Adamski 2010-10-05 16:30:39

+1

在野外多久樹會變得足夠大,以至於變得足夠慢而擔心? – 2015-08-16 22:53:21

2

你需要確保更新模型後您指示它開火事件造成被通知該事件的任何註冊的偵聽。其中一名聽衆將是JTree,並在收到活動後重新繪製。

例如,DefaultTreeModel包含方法:你需要確保你是在事件指派更新模型

nodeChanged nodesChanged nodeStructureChanged nodesWereInserted nodesWereRemoved

此外,與所有Swing編程線程

+1

你不必自己解開這些事件。你所要做的就是通過調用'insertNodeInto'方法來更新模型,並讓模型負責將事件觸發到TreeModelListeners。 – dogbane 2010-09-29 13:28:52

+1

好點,雖然在某些情況下最好自己管理它。例如,如果我想添加1000個子節點,我不希望激發1000個「節點被添加」事件。 – Adamski 2010-09-29 14:13:11

+0

謝謝,先生!但是你提到的這些方法是私有的,無法訪問。 – sajad 2010-09-30 12:43:41

-1

你的意思是GUI方面只是沒有顯示你的改變?你應該看看int repaint()revalidate().

Here's很好的描述何時調用哪一個。

+0

是的,調用這個方法是必要的。 – sajad 2010-09-30 12:44:33

+4

-1,不需要repaint()和revalidate()。當您使用模型時,模型負責通知更改的視圖,以便樹可以重新繪製自己。 – camickr 2010-09-30 14:42:23