Моя возможная реализация:
- Имеется два
TreeModel
s, базовый и отфильтрованный.
- Когда происходит изменение в базовом
TreeModel
, восстановите отфильтрованный TreeModel
с нуля. Клонируйте каждый узел, который должен быть видимым, и добавьте его к своему первому видимому предку в отфильтрованном TreeModel
(или корне, если ни один из них не виден). Посмотрите кодез ниже, если вам интересно.
К сожалению, побочным эффектом является свертывание всех путей, открытых пользователем. Чтобы обойти это, я добавил TreeModelListener
к фильтрованному TreeModel
. Когда модель изменяется, я сохраняю развернутые пути в JTree
(используя getExpandedDescendants()
), а затем снова расширяю их (используя SwingUtilities.invokeLater()
).
Мне пришлось переопределить equals()
в используемом классе TreeNode
, чтобы новые клонированные узлы были такими же, как старые клонированные узлы.
...
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);
}
}
}