2012-02-29 1 views
8

Я знаю (я посмотрел на источники;)), что сортировка по JXTreeTable отключена.Как сделать JXTreeTable сортировать его верхние элементы

Однако я хотел бы разрешить сортировку по всем столбцам, основанную только на значениях прямых дочерних элементов корневого узла.

Скажем, у меня есть структура вроде этого:

Name  /Date  /File UID 
(Root) 
|- Mr. X /1996/10/22/AE123F6D 
|--- File1/2012/01/10/DFC2345Q 
|--- File2/2012/01/11/D321FEC6 
|- Mrs. Y/1975/03/03/G2GF35EZ 
|--- File3/2012/02/29/35GERR32 
|--- File4/2012/01/22/LKJY2342 
. 
. 
.

То, что я хочу достичь перебирает на 3 колонки только на узлах первого уровня. Скажем, я хочу, чтобы отсортировать его по возрастанию даты, она будет в конечном итоге так:

Name  /Date  /File UID 
(Root) 
|- Mrs. Y/1975/03/03/G2GF35EZ 
|--- File3/2012/02/29/35GERR32 
|--- File4/2012/01/22/LKJY2342 
|- Mr. X /1996/10/22/AE123F6D 
|--- File1/2012/01/10/DFC2345Q 
|--- File2/2012/01/11/D321FEC6 
. 
. 
.

Как я понимаю, это ressembles для простой таблицы сортировки (так иерархического ограничения вызывается для отключения сортировки приподнимается).

Я вижу 2 возможности, чтобы сделать это:

  1. Повторно включите сортировочный механизм, доступный в JXTable, чтобы извлечь выгоду из всего того, что уже реализовано (сортировщик, сортировочного, нажав на заголовки, ...) и только сортировать узлы первого уровня (поскольку их дети все равно будут иметь один и тот же родительский элемент).
  2. Реализовать основные элементы, которые мне нужны (сортировка, нажав на заголовки в основном), иметь список идентификаторов строк модели в JXSortableTreeModel, которые я сортирую и переопределяю convertRowIndexToModel, который позволит (я думаю) отобразить мой элемент, отсортированный как я хотеть.

Мой любимый, конечно, первый, но я не знаю, как его достичь. Первое ограничение заключается в том, что я не знаю, как повторно включить сортировку, поскольку JXTreeTable переопределяет setSortable() (и все связанные методы), и я не знаю, как получить прямой доступ к реализации метода в JXTable (это проблема Java). Я мог бы просто скопировать код JXTreeTable и удалить переопределения, но это не вариант, на мой взгляд.

Скажем, я решаю это, как бы ограничить сортировку узлов первого уровня? Даже посмотрев на источник, я довольно не знаю, как это сделать.

Со вторым я потерял все преимущества существующего кода, но я вижу практический способ достижения того, что я хочу (на данный момент, по крайней мере. Кто знает, не хочет ли фильтр фильтровать данные по всем строкам?).

Есть ли другой способ? Если нет, какое из моих решений я должен выбрать? Какие-нибудь проницательные комментарии?

Большое спасибо заранее!

ответ

3

maybe sorting TreeTable following way(s), по aephyr, кстати, этот свинг Гуру играл с Nimbus Look и Feel тоже код смешные Nimbus включены

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

+0

Спасибо! Я просмотрел источники TreeTable, и я должен сказать, это выглядит многообещающим. Я постараюсь лучше рассмотреть его позже :) – ixM

+1

Решение Aephyr работает хорошо, но исходный код практически не содержит документации или комментариев. Демонстрация - хороший пример, но я все еще сталкивался с несколькими Исключениями, которые были выброшены на EDT. Головные боли отладки и поддержки этих и будущих проблем в коде вроде этого - большие пальцы вниз для меня. – Nate

+0

@nate это кодовая выставка одного из великих гуру Свинг, кодовых складов для нескольких форумов, на которых афиры являются членами, не имеют представления об исключениях EDT или нарушениях, из вашего кода должна быть вторичная проблема :-) – mKorbel

1

мне удалось это сделать играя на уровне узлов.Это метод, который я создал в моем дереве таблицы узла, который простирается AbstractMutableTreeTableNode:

/** 
* This method recursively (or not) sorts the nodes, ascending, or descending by the specified column. 
* @param sortColumn Column to do the sorting by. 
* @param sortAscending Boolean value of weather the sorting to be done ascending or not (descending). 
* @param recursive Boolean value of weather or not the sorting should be recursively applied to children nodes. 
* @author Alex Burdu Burdusel 
*/ 
public void sortNode(int sortColumn, boolean sortAscending, boolean recursive) { 
    mLastSortAscending = sortAscending; 
    mLastSortedColumn = sortColumn; 
    mLastSortRecursive = recursive; 

    int childCount = this.getChildCount(); 
    TreeMap<Object, BRFTreeTableNode> nodeData = new TreeMap(String.CASE_INSENSITIVE_ORDER); 

    for (int i = 0; i < childCount; i++) { 
     BRFTreeTableNode child = (BRFTreeTableNode) this.getChildAt(i); 
     if (child.getChildCount() > 0 & recursive) { 
      child.sortNode(sortColumn, sortAscending, recursive); 
     } 
     Object key = child.getData()[sortColumn]; 
     nodeData.put(key, child); 
    } 

    Iterator<Map.Entry<Object, BRFTreeTableNode>> nodesIterator; 
    if (sortAscending) { 
     nodesIterator = nodeData.entrySet().iterator(); 
    } else { 
     nodesIterator = nodeData.descendingMap().entrySet().iterator(); 
    } 

    while (nodesIterator.hasNext()) { 
     Map.Entry<Object, BRFTreeTableNode> nodeEntry = nodesIterator.next(); 
     this.add(nodeEntry.getValue()); 
    } 
} 

Надеется, что это помогает кто-то еще, так как я думаю, что нить нож уже понял это.