2011-07-26 36 views
3

我正在使用一個DefaultTreeModel填充覆蓋DefaultMutableTreeNode它支持可選地更改樹中節點的顯示字符串。如下面的代碼所示,在我的表單中,我通過在一個單獨的類中創建新節點來填充樹,然後通過包裝類將它們傳遞給我的主數據類型。該過程將創建一個新的覆蓋DefaultMutableTreeNode,爲其添加子項(每個AccessPoint由具有多個子節點的節點表示),然後將其存儲以供以後在UI中使用。當TreeModel添加新節點時,爲什麼不是我的JTree更新?

第一次以這種方式添加節點時,它的效果非常好。任何後續添加以下代碼的節點實際上都存儲在DefaultTreeModel中,但JTree未被更新爲新節點。

爲什麼在添加第一個孩子後JTree未填充?

private void populateAccessPointTreeModel(AccessPointDataWrapper wrapper) { 
    //the pre-created DefaultMutableTreeNode subclass instance is 
    // stored in the wrapper 
    DefaultMutableTreeNode accessPointNode = 
      wrapper.getAccessPointTreeNode(); 
    //this line updates the accessPointTree with the new node (I've looked at the 
    // value in debug mode, and it does in fact add the node 
    ((DefaultMutableTreeNode) accessPointTree.getRoot()).add(accessPointNode); 
    //unrelated logic happens down here... 
} 

我可以包括如果有必要,我創建節點的代碼,但我不認爲這是問題。

+0

您是否嘗試過重新繪製組件或其父項? – Bitmap

回答

7

問題是DefaultMutableTreeNode未通知DefaultTreeModel其子項已更新。要做到這一點,你要麼在表格模型中調用適當的方法(nodesChanged或類似的方法)或(最好)使用DefaultTreeModel.insertNodesInto方法。

DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel(); 
DefaultMutableTreeNode root = model.getRoot(); 
model.insertNodeInto(accessPointNode, root, root.getChildCount()); 
+0

+1,更新到Swing comopnents應該始終使用模型來完成。 – camickr

+0

這很有道理。我以前一直通過我已經保存在UI類中的DefaultTreeModel進行更新,我只是最終使用了DefaultMutableTreeNode上的添加,因爲它更短。謝謝。 –

+0

我相信root.getChildCount()會在insertNodeInto上拋出異常(相信,我的意思是我從經驗中知道)。線程「線程」中的異常java.lang.ArrayIndexOutOfBoundsException:1> 0 at java.util.Vector.insertElementAt(Vector.java:571) at javax.swing.tree.DefaultMutableTreeNode.insert(DefaultMutableTreeNode.java:195 ) at javax.swing.tree.DefaultTreeModel.insertNodeInto(DefaultTreeModel.java:234) –

0

很可能你有一些線程問題。您的JTree更新是某個線程,但JTree的重要副本(在Swing事件調度線程(EDT)中顯示的那個)不知道這些更改。

如果是這樣的話,你必須使用更新的JTree在Swing EDT:

SwingUtilities.invokeLater(new Runnable() { 
    @Override public void run() { ... update jTree here } 
}); 

我不知道JTree的...也許這是你必須在Swing更新的TreeModel美東時間。

相關問題