私はJTree
を使用するSwingアプリケーションを持っています。私はツリーのいくつかのノードを隠しておきたいので、2つのノードを実装しました.1つはすべてのノードに、もう1つは表示するものだけでフィルタリングしました。後者は実際のモデルとして設定されています。TreeModelのリロード後にノード選択が正しく機能しないのはなぜですか?
フィルタリングされたノードを変更する必要がありますが、ツリーのアイテムは正しく更新されますが、その動作は間違っています。 ノードが選択されても強調表示されず(実際に選択されているにもかかわらず)、ユーザはダブルクリックしてノードを展開することはできません。少しの「+」ボタンをクリックする必要があります。
以下は私のコードの一般化です。私のカスタムクラスの2つのメソッドは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を拡張する私のカスタムクラス" *これは、JTreeを拡張する場合ではなく、100対1の確率を与えます。 –
@Andrew私はこれを初めて熟知しているので、私はカスタムサブクラスを作成するべきかどうかを正確に知らない。なぜこれは 'JTree'を拡張するためのケースではないとあなたは賭けていますか?選択されたノードが強調表示されない理由と関連がありますか? – Robin
コードを見ると、もっと分かります。 MCVE/SSCCEの後にコードを見ていきます。 –