2013-07-29 14 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

相关问题