繁体   English   中英

由KeyListener在JTextField中更新的动态JTree

[英]Dynamic JTree updated by KeyListener in a JTextField

我希望通过用户启动的搜索(在树的元素上)动态更新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:我选择删除树并生成一个新树,以避免使树和数据保持同步,因为它看起来更加复杂。

JTree myTree = new JTree(treeModel);

那句话看起来不正确。 您创建了一个新的JTree,但是我看不到将树添加回框架的位置。

无需创建新树,只需重置树的模型即可:

myTree.setModel( treeModel );

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

不要使用KeyListener。 您应该使用DocumentListener来侦听文本中的更改。 阅读Swing教程中有关文档更改的侦听器的部分。

在重新加载模型之前,我确实通过创建和设置新的根节点来加载“新”树。 在我看来,这似乎并不“干净”,但确实可以解决问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM