2013-07-29 34 views
4

我目前正試圖有沒有辦法強制JTree中的節點必須是唯一的,最好不用編寫TreeModel的實現?

DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); 

DefaultMutableTreeNode child = new DefaultMutableTreeNode("String"); 

if (model.getIndexOfChild(root, child) == -1) { 
    model.insertNodeInto(child, root, root.getChildCount()); 
} 

model.reload(root); 

我使用'isNodeChild()' method in MutableTreeNode而不是在TreeModel的getIndexOfChild()方法也試過。

這似乎應該是一個非常平凡的事情:做一個給定的節點在樹中,看看是否有一個具有指定的值(在這種情況下,String),已經存在的子節點。如果有,請不要添加新的子節點。否則,將該節點添加爲小孩。

對此提出建議?

+0

真的不因爲JTrees任何值由修改視圖可以在TreeCellRenderer中,RowFilter只能訪問模型 – mKorbel

+0

有什麼問題?順便說一句:不要調用重新加載 - 插入模型api照顧正確的通知 – kleopatra

+0

@kleopatra檢查下面的答案。 model.getIndexOfChild()沒有做他認爲應該做的事。當他搜索索引是否存在時,它不搜索字符串,它搜索DefaultMutableTreeNode。 – JBuenoJr

回答

3

我覺得代碼很容易閱讀。只要循環播放每一首歌曲,並追蹤它是否唯一。如果你關心跟蹤它,如果它加入測試方法的

返回真/假

DefaultMutableTreeNode child = new DefaultMutableTreeNode("String"); 
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode("String"); 
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode("String1"); 

addUniqueNode(child, model); // Will get added 
addUniqueNode(child1, model); // Will not get added 
addUniqueNode(child2, model); // Will get added 

方法:

public boolean addUniqueNode(DefaultMutableTreeNode childNode, DefaultTreeModel model) 
{ 
    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); 

    // Check each node 
    boolean isUnique = true; 
    for (int i = 0; i < model.getChildCount(root); i++) 
    { 
     Object compUserObj = ((DefaultMutableTreeNode) model.getChild(root, i)).getUserObject(); 
     if (compUserObj.equals(childNode.getUserObject())) 
     { 
      isUnique = false; 
      break; 
     } 
    } 

    // If Unique, insert 
    if(isUnique) 
     model.insertNodeInto(childNode, root, root.getChildCount()); 

    return isUnique; 
} 
+0

有道理。我很希望這種功能可以以某種方式構建,因爲它看起來很常見。 –

+0

我完全同意。 – JBuenoJr

+0

重複:不要調用模型重新加載.. insertNodeInto已經處理通知。另外,如果我們知道所有節點都是DMTN類型,則最好不要通過toString比較對象,比較它們的userObjects – kleopatra

相關問題