Сокрытие/фильтрация узлов в JTree?

Поскольку у вашего абстрактного класса нет состояния, вы можете преобразовать его в Trait (Interface), а в Scala вы можете определить интерфейсы с помощью методов, как показано ниже

trait Equipment{

  var numberOwned = 0
  var name: String = ""

  def goldPerSecond(): Double = {
      numberOwned
  }
}

 class TestEquipment extends FunSuite with Equipment {
    this.numberOwned = 0
        test("first test"){
    }
}

. и реализовать интерфейс оборудования.

Как уже упоминалось в комментариях, вы не можете наследовать от FunSuite и BaseClass одновременно.

10
задан Tom Hawtin - tackline 6 May 2009 в 21:21
поделиться

6 ответов

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

2
ответ дан 3 December 2019 в 22:39
поделиться

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

0
ответ дан 3 December 2019 в 22:39
поделиться

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

  • Имею два TreeModel , базовый и фильтрованный.
  • Когда происходит изменение в базовом 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);
      }
    }
  }
8
ответ дан 3 December 2019 в 22:39
поделиться

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

1
ответ дан 3 December 2019 в 22:39
поделиться

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

0
ответ дан 3 December 2019 в 22:39
поделиться

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

3
ответ дан 3 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: