由 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 和 "remove" 所有不符合搜索条件的节点中搜索 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 );

The search is implemented with JTextField and a KeyListener that calls createTree(searchOption, searchText).

不要使用 KeyListener。您应该使用 DocumentListener 来监听文本的变化。阅读 Listener For Change on a Document 上的 Swing 教程部分。

我确实设法通过在重新加载模型之前创建和设置新的根节点来加载 "new" 树。对我来说似乎 "clean",但它成功了。

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