我有一个使用JTree
. 我希望隐藏树的一些节点,所以我实现了两个DefaultTreeModel
s,一个包含每个节点,一个过滤后只包含应该显示的节点。后者被设置为实际模型。
在某些时候,我必须更改过滤的节点,当我这样做时,树中的项目会正确更新,但它们的行为是错误的。节点在被选中时不会突出显示(即使它们确实被选中)并且用户不能再双击展开节点,他们必须单击小“+”按钮。
下面是我的代码的概括,我的自定义类中的两个方法扩展了JTree
.
updateFilter
当过滤器需要更新时被调用。
populateFilteredNode
递归地填充我的过滤模型的根节点。为简单起见,filteredRoot
是一个类成员变量(类型为DefaultMutableTreeNode
)并且是过滤模型的根。fullModel
并且filteredModel
是类型DefaultTreeModel
public void updateFilter() {
// Get current expansion state
ArrayList<Integer> expansionState = getExpansionState();
DefaultMutableTreeNode fullModelRoot = fullModel.getRoot();
// Remove existing nodes in the filtered model
while(filteredRoot.getChildCount() > 0) {
filteredModel.removeNodeFromParent(filteredRoot.getFirstChild());
}
populateFilteredNode(fullModelRoot, filteredRoot);
// Repaint tree and restore expansion state
repaint();
setExpansionState(expansionState);
}
private void populateFilteredNode(DefaultMutableTreeNode fullNode, DefaultMutableTreeNode filteredNode) {
int index = 0;
for(int n = 0; n < fullNode.getChildCount(); n++) {
DefaultMutableTreeNode fullChildNode = fullNode.getChildAt(n);
// Show the item and its children if one of many cases is true
if(shouldShowItem(fullChildNode.getItem())) {
DefaultMutableTreeNode filteredChildNode = fullChildNode.clone();
filteredModel.insertNodeInto(filteredChildNode, filteredNode, index++);
populateFilteredNode(fullChildNode, filteredChildNode);
}
}
}
如果有人有类似经历或知道为什么所选节点不会突出显示,请告诉我。或者如果有更好的方法来完成过滤。或者,如果更多代码有助于提供答案。