Java 有没有办法强制JTree中的节点必须是唯一的,最好不用编写TreeModel的实现?

Java 有没有办法强制JTree中的节点必须是唯一的,最好不用编写TreeModel的实现?,java,swing,jtree,Java,Swing,Jtree,我正在努力 DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot(); DefaultMutableTreeNode child = new DefaultMutableTreeNode("String"); if (model.getIndexOfChild(root, child) == -1) { model.insertNodeInto(child, root, root.getChildCo

我正在努力

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);
我还尝试在TreeModel上使用而不是
getIndexOfChild()
方法

这似乎应该是一件非常简单的事情:在树中取一个给定的节点,看看是否有一个具有指定值的子节点(在本例中是一个
字符串
)已经存在。如果存在,请不要添加新的子节点。否则,将节点添加为子节点


建议?

我认为代码很容易阅读。只要在每个轨道上循环,如果它是唯一的。如果您想跟踪它,如果添加了它,它将返回true/false

方法的检验

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;
}
public boolean addUniqueNode(DefaultMutableTreeNode子节点,DefaultTreeModel模型)
{
DefaultMutableTreeNode根=(DefaultMutableTreeNode)model.getRoot();
//检查每个节点
布尔值isUnique=true;
for(int i=0;i
确实不是因为JTrees视图中的任何值都可以在TreeCellRenderer中修改,所以RowFilter只能访问模型有什么问题?顺便说一句:不要调用重新加载-使用模型api插入将处理正确的notification@kleopatra检查下面我的答案。getIndexOfChild()没有做他认为应该做的事情。当他搜索索引是否存在时,不是搜索字符串,而是搜索DefaultMutableTreeNode。@JosephBueno是的。我认为比较两个节点的方式并不是我所期望的。我本以为会根据内容对它们进行比较,但事实并非如此。@JosephBueno good catch-如果打赌DMTN的对等项被覆盖,我会赔钱的;-)这是另一种选择,有道理。我有点希望这个功能会以某种方式内置,因为它似乎非常常见。重复:不要调用模型重新加载。。insertNodeInto已经处理了通知。另外,最好不要通过toString来比较对象。如果我们知道所有节点都是DMTN类型,请比较它们的userObjects@kleopatra,我更新了你的建议,不打电话重新加载。在问题中,他表示希望字符串值是唯一的。你能详细说明一下不使用toString()的情况吗?它既不安全又不完整。不安全,因为您的方法应该处理所有类型的DMTN,并且子类可能会重写它们的toString。在一般情况下是不完整的(正如您正确说明的,当前的用例明确要求使用字符串作为userObject:-),因为userObject可以是任何类型的type@kleopatra-啊,我明白了。你应该为这个问题添加另一个答案。我相信其他遇到这个问题的人会很感激的。我也会:-)