2012-02-29 9 views
8

Jestem świadomy (sprawdziłem źródła;)), że sortowanie w JXTreeTable zostało wyłączone.Jak sprawić, by JXTreeTable sortowało swoje najlepsze elementy?

Chciałbym jednak pozwolić na sortowanie we wszystkich kolumnach w oparciu o wartości bezpośrednich elementów potomnych węzła głównego.

Say I mają strukturę takiego:

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 
. 
. 
.

Co chcę osiągnąć jest sortowanie na 3 kolumny tylko na węzłach pierwszego poziomu. Że chcę, aby posortować je według daty rosnąco, to kończy się tak:

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 
. 
. 
.

Jak ja to widzę, to ressembles do prostego sortowania tabeli (tak hierarchicznej ograniczenia przywoływana przez wyłączenie sortowania jest podniesiona).

widzę 2 możliwości, aby to zrobić:

  1. Ponownie włącz mechanizm sortowania dostępne w JXTable korzystać z wszystkiego, co jest już zrealizowane (sorter, sortowania, klikając nagłówki, ...) i sortuj tylko węzły pierwszego poziomu (ponieważ ich dzieci nadal będą miały tego samego rodzica).
  2. Zaimplementuj podstawowe elementy, których potrzebuję (sortując, klikając głównie nagłówki), a następnie wypisz listę modeli-wierszy-identyfikatorów w JXSortableTreeModel, które sortuję i zastępuję convertRowIndexToModel, co pozwoli (jak sądzę) wyświetlić moją pozycję posortowaną jako I chcieć.

Moim ulubionym jest oczywiście pierwszy, ale nie wiem, jak go osiągnąć. Pierwsze ograniczenie polega na tym, że nie wiem jak ponownie włączyć sortowanie jako JXTreeTable przesłania setSortable() (i wszystkie powiązane metody) i nie wiem jak uzyskać bezpośredni dostęp do implementacji metody w JXTable (to jest problem z Javą). Mogę po prostu skopiować kod JXTreeTable i usunąć przesłonięcia, ale nie jest to według mnie opcja.

Powiedz, jak to rozwiązać, w jaki sposób ograniczyć sortowanie do węzłów pierwszego poziomu? Nawet patrząc na źródło, nie mam pojęcia, jak to zrobić.

Po drugie, tracę wszystkie zalety istniejącego kodu, ale widzę praktyczny sposób osiągnięcia tego, co chcę (przynajmniej na razie.) Kto wie, czy nie będzie chciał filtrować danych we wszystkich wierszach?).

Czy jest inny sposób na wyjazd? Jeśli nie, które z moich rozwiązań powinienem wybrać? Wszelkie wnikliwe komentarze?

Wielkie dzięki z góry!

Odpowiedz

3

maybe sorting TreeTable following way(s) przez aephyr, btw to Swing Guru grał z Nimbus wyglądać i czuć się zbyt, kod dla Zabawna Nimbus zawarte

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

Dzięki! Przeglądałem źródła TreeTable i muszę powiedzieć, że wygląda obiecująco. Spróbuję lepiej to sprawdzić później :) – ixM

+1

Rozwiązanie Aephyr działa dobrze, ale kod źródłowy praktycznie nie zawiera dokumentacji ani komentarzy. Demo to dobry przykład, ale wciąż natknąłem się na kilka wyjątków wyrzucanych na EDT. Bóle głowy związane z debugowaniem i obsługą tych i przyszłych problemów w kodzie takim jak ten są dla mnie dużym zaskoczeniem. – Nate

+0

@nate to wystawa kodu od jednego z wielkich guru Swing, zajezdni kodu dla kilku forów, gdzie aephyr są członkami, nie ma pojęcia o wyjątkach EDT ani naruszeniach, musi być dodatkowy problem z twojego kodu :-) – mKorbel

1

udało mi się to zrobić grając na poziomie węzłów.Jest to metoda stworzyłem w moim drzewie węzła tabeli, która rozciąga 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()); 
    } 
} 

nadzieję, że pomoże ktoś inny, ponieważ myślę, że otwieracz wątek już zdobione.

Powiązane problemy