我希望我的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;
}
从这些类中,我通过循环遍历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中的String或Int,并“删除”与搜索条件不匹配的所有节点。但不是对象,只有相应的树节点。因此,当用户完成搜索时,我可以再次显示整个树。
使用JTextField和调用createTree(searchOption,searchText)的KeyListener实现搜索。
到目前为止,我尝试使用removeAllChildren()删除所有节点,然后添加符合搜索条件的新节点。之后重新加载TreeModel似乎不起作用。
createTree(searchOption, searchText);
rootNode.removeAllChildren();
treeModel.reload(rootNode);
我有什么想法可以做到这一点?
PS:我选择删除树并生成一个新树,以避免树和数据同步,因为它看起来更复杂。
答案 0 :(得分:0)
JTree myTree = new JTree(treeModel);
该陈述看起来不正确。您创建了一个新的JTree,但我没有看到您将树添加回框架的位置。
不要创建新树,只需重置树的模型:
myTree.setModel( treeModel );
使用JTextField和调用createTree(searchOption,searchText)的KeyListener实现搜索。
不要使用KeyListener。您应该使用DocumentListener
来监听文本中的更改。阅读Listener For Change on a Document上的Swing教程中的部分。
答案 1 :(得分:0)
我确实设法加载了一个新的&#34;通过在重新加载模型之前创建和设置新的根节点来创建树。它看起来并不干净&#34;对我来说,但它确实做到了。
rootNode = createTree(searchOption, searchText);
treeModel.setRoot(rootNode);
treeModel.reload();