动态JTree由KeyListener在JTextField

时间:2017-07-02 16:29:59

标签: java swing jtree

我希望我的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:我选择删除树并生成一个新树,以避免树和数据同步,因为它看起来更复杂。

2 个答案:

答案 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();