【问题标题】:Dynamic JTree updated by KeyListener in a JTextField由 JTextField 中的 KeyListener 更新的动态 JTree
【发布时间】:2017-07-02 16:29:59
【问题描述】:

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

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:
    JTree myTree = new JTree(treeModel);
    

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

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

    myTree.setModel( treeModel );
    

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

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

    【讨论】:

    • 感谢 DocumentListener 的提示。重置模型不起作用。我发布了我找到的解决方案。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      相关资源
      最近更新 更多