I have a data object represented in a TreeModel
, and I'd like to show only part of it in my JTree
--for the sake of argument, say the leaves and their parents. How can I hide/filter the unnecessary nodes?
views:
1865answers:
6So long as it is still a tree you are displaying, then TreeModel
that filters you existing TreeModel
should be simple enough.
My eventual implementation:
- Have two
TreeModel
s, the underlying one and the filtered one. - When a change occurs on the underlying
TreeModel
, rebuild the filteredTreeModel
from scratch. Clone each node that should be visible, and add it to its first visible ancestor in the filteredTreeModel
(or the root if none are visible). See teh codez below, if you're curious. This has the unfortunate side effect of collapsing every path the user had open. To get around this, I added a
TreeModelListener
to the filteredTreeModel
. When the model changes, I save the expanded paths in theJTree
(usinggetExpandedDescendants()
), then re-expand them later (usingSwingUtilities.invokeLater()
).I had to override
equals()
in theTreeNode
class I was using so that the new cloned nodes would be the same as the old cloned nodes.
...
populateFilteredNode(unfilteredRoot, filteredRoot);
...
void populateFilteredNode(TreeNode unfilteredNode, TreeNode filteredNode)
{
for (int i = 0; i < unfilteredNode.getChildCount(); i++)
{
TreeNode unfilteredChildNode = unfilteredNode.getChildAt(i);
if (unfilteredChildNode.getType() == Type.INVISIBLE_FOLDER)
{
populateFilteredNode(unfilteredChildNode, filteredNode);
}
else
{
TreeNode filteredChildNode = unfilteredChildNode.clone();
filteredNode.add(filteredChildNode);
populateFilteredNode(unfilteredChildNode, filteredChildNode);
}
}
}
If you're looking for a commercial solution, JideSoft has a filterable treemodel. Other than that, SwingX has a Filter API which'll work on JXTable, JXTreeTable, JXTree, and JXList.
You should be aware of GlazedLists. It's a fantastic library for doing complex table transformations with little effort. They've also expanded to trees too. It may require a little refactoring of your existing code to get it into the GlazedLists way of working. But check out the demo and the webcasts to see how powerful it is. (It's one of the essential Swing libraries in my view, and it's open source.)