我有一個使用JTree
的Swing應用程序。我希望樹的某些節點被隱藏,所以我實現了兩個DefaultTreeModel
,每個節點都有一個節點,並且只有那些應該顯示的節點。後者被設定爲實際模型。爲什麼TreeModel重新加載後節點選擇無法正常工作?
在某些點上,我必須更改過濾的節點,當我這樣做時,樹中的項目會正確更新,但它們的行爲是錯誤的。 節點在被選中時不會突出顯示(即使它們確實被選中),並且用戶不能再雙擊來展開節點,但它們必須單擊小小的「+」按鈕。
下面是我的代碼的概括,我的自定義類中的兩個方法擴展了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);
}
}
}
如果任何人有類似的經歷或知道爲什麼選定的節點將不會高亮顯示,請讓我知道的。或者如果有更好的方法來完成過濾。或者如果更多的代碼可以幫助提供答案。
1)爲了更好地提供幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 2)*「..我自定義的類擴展了'JTree'。」*我會給出100比1的賠率,這是**不是**擴展'JTree'的情況。 –
@Andrew我承認我是新手,所以我不知道我應該或不應該創建自定義子類。爲什麼你會打賭,這不是擴展'JTree'的情況?這是否與所選節點爲什麼不突出有關? – Robin
當我查看代碼時,我會知道更多。有一個MCVE/SSCCE後,我會查看代碼。 –