2017-07-02 56 views
0

我希望我的JTree能够通过用户启动的搜索(通过树的元素)进行动态更新。从控制台上的输出中,我可以看出,搜索工作就像它应该那样。问题是更新树。动态JTree由JTextField中的KeyListener更新

这是我得到的。我有一组类如

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; 
} 

从这些类我通过循环createTree()中的类列表生成一个JTree。

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.name或classC.id中搜索树或字符串,并“删除”与搜索条件不匹配的所有节点。但不是对象,只有对应的树节点。因此,当用户完成搜索时,我可以再次显示整棵树。

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

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

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

任何想法我可以做到这一点?

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

回答

0

我确实通过在重新加载模型之前创建并设置新的根节点来加载“新”树。它对我来说似乎并不“干净”,但它确实有效。

rootNode = createTree(searchOption, searchText); 
    treeModel.setRoot(rootNode); 
    treeModel.reload(); 
0
JTree myTree = new JTree(treeModel); 

该陈述看起来不正确。您创建了一个新的JTree,但我没有看到将树添加回框架的位置。

而不是创建一个新的树,只是重置树的模型:

myTree.setModel(treeModel); 

搜索与JTextField中并调用createTree(searchOption,SEARCHTEXT)一个KeyListener的实现。

请勿使用KeyListener。您应该使用DocumentListener来侦听文本中的更改。请阅读Listener For Change on a Document上的Swing教程部分。

+0

感谢您使用DocumentListener的提示。重置模型不起作用。我发布了我找到的解决方案。 – JKB