由 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();
我希望我的 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();