Скрытие / фильтрация узлов в JTree? - PullRequest
10 голосов
/ 07 мая 2009

У меня есть объект данных, представленный в TreeModel, и я хотел бы показать только часть его в моем JTree - ради аргумента, скажем, листья и их родители. Как я могу скрыть / отфильтровать ненужные узлы?

Ответы [ 7 ]

8 голосов
/ 07 мая 2009

Моя возможная реализация:

  • Имеется два 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);
      }
    }
  }
3 голосов
/ 14 августа 2009

Вы должны знать о GlazedLists . Это фантастическая библиотека для выполнения сложных преобразований таблиц без особых усилий. Они также расширились до деревьев тоже. Это может потребовать небольшой рефакторинг вашего существующего кода, чтобы включить его в способ работы GlazedLists. Но посмотрите демо и веб-трансляции, чтобы увидеть, насколько они мощные. (На мой взгляд, это одна из основных библиотек Swing, и она с открытым исходным кодом.)

2 голосов
/ 08 мая 2009

Вы пробовали JXTree ? (к сожалению, сайт сейчас недоступен, но вы можете поискать зеркала в Google)

1 голос
/ 14 декабря 2012

Посмотрите на эту реализацию: http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm

Создает подклассы DefaultMutableNode, добавляя свойство «isVisible», а не фактически удаляя / добавляя узлы из TreeModel.

1 голос
/ 10 мая 2009

Если вы ищете коммерческое решение, у JideSoft есть фильтруемая древовидная модель. Помимо этого, SwingX имеет API-интерфейс фильтра, который будет работать с JXTable, JXTreeTable, JXTree и JXList.

0 голосов
/ 07 мая 2009

Используйте код, который вы используете, чтобы построить свои TreeNode и перестроить TreeNode только с теми элементами, которые вы хотите. Установите корневой узел на TreeModel с отфильтрованным корневым узлом.

0 голосов
/ 07 мая 2009

Пока вы отображаете дерево, TreeModel, который фильтрует ваше существующее TreeModel, должно быть достаточно простым.

...