代码之家  ›  专栏  ›  技术社区  ›  JKB

由JTextField中的KeyListener更新的动态JTree

  •  0
  • JKB  · 技术社区  · 7 年前

    我希望通过用户启动的搜索(在树的元素上)动态更新我的JTree。从控制台上的输出中,我可以看出,搜索工作正常。问题是更新树。

    这是我得到的。我有一系列的课程,比如

    public class classA {
    
        int id;
    
        String name;
    
        List<ClassB> listOfClassB;
    }
    
    public class classB {
    
        int id;
    
        String name;
    
        List<ClassC> listOfClassC;
    }
    
    public class classC {
    
        int id;
    
        String name;
    }
    

    private DefaultMutableTreeNode rootNode;
    rootNode = createTree("New", ""); // "New" tells the method to generate the complete tree
    treeModel = new DefaultTreeModel(rootNode);
    JTree myTree = new JTree(treeModel);
    

    到现在为止,一直都还不错。现在我想在树中搜索classC中的字符串或Int。名称或类别C。标识并“删除”所有与搜索条件不匹配的节点。但不是对象,只有相应的树节点。这样,当用户完成搜索时,我可以再次显示整个树。

    搜索是用JTextField和一个调用createTree(searchOption,searchText)的KeyListener实现的。

    到目前为止,我已经尝试使用removeAllChildren()删除所有节点,然后添加符合搜索条件的新节点。之后重新加载TreeModel在这里似乎不起作用。

    createTree(searchOption, searchText);
    rootNode.removeAllChildren();
    treeModel.reload(rootNode);
    

    PS:我选择删除树并生成一个新的,以避免保持树和数据同步,因为它看起来更复杂。

    2 回复  |  直到 7 年前
        1
  •  0
  •   camickr    7 年前
    JTree myTree = new JTree(treeModel);
    

    那句话看起来不正确。您创建了一个新的JTree,但我看不出您在哪里将树添加回框架。

    与其创建新树,不如重置树的模型:

    myTree.setModel( treeModel );
    

    搜索是用JTextField和一个调用createTree(searchOption,searchText)的KeyListener实现的。

    不要使用KeyListener。你应该使用 DocumentListener Listener For Change on a Document .

        2
  •  0
  •   JKB    7 年前

        rootNode = createTree(searchOption, searchText);
        treeModel.setRoot(rootNode);
        treeModel.reload();