2012-02-29 27 views
8

Soy consciente (he consultado las fuentes;)) que la ordenación en JXTreeTable se ha deshabilitado.Cómo hacer que una clase JXTreeTable ordene sus elementos superiores

Sin embargo, me gustaría permitir la ordenación en todas las columnas basadas solo en los valores de los elementos secundarios directos del nodo raíz.

Digamos que tiene una estructura como esta:

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

Lo que quiero lograr es la clasificación de las 3 columnas sólo en los nodos de primer nivel. Digamos que quiero para ordenar por fecha de forma ascendente, sería terminar así:

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

Tal como lo veo, es ressembles a una simple mesa de selección (lo que la limitación jerárquica invocado para desactivar la clasificación se levanta).

veo 2 posibilidades de hacerlo:

  1. Vuelva a activar el mecanismo de selección disponibles en JXTable para beneficiarse de todo lo que ya se implementa (clasificador, clasificación haciendo clic en los encabezados, ...) y solo ordena los nodos del primer nivel (ya que sus hijos aún tendrían el mismo padre).
  2. Implementa las cosas básicas que necesito (clasificando haciendo clic en los encabezados en su mayoría), tengo una lista de ids de filas de modelos en JXSortableTreeModel que ordeno y anulo convertRowIndexToModel que permitiría (creo) mostrar mi ítem ordenado como yo querer.

Mi favorito es, por supuesto, el primero, pero no sé cómo lograrlo. La primera limitación es que no sé cómo volver a habilitar la ordenación ya que JXTreeTable anula setSortable() (y todos los métodos relacionados) y no sé cómo acceder directamente a la implementación del método en JXTable (que es un problema de Java)) Simplemente podría copiar el código de JXTreeTable y eliminar las anulaciones, pero esa no es una opción en mi opinión.

Digamos que resuelvo esto, ¿cómo limitaría la clasificación a los nodos de primer nivel? Incluso después de mirar la fuente, no tengo idea acerca de cómo hacer eso.

Con la segunda, pierdo todos los beneficios del código existente pero veo una forma práctica de lograr lo que quiero (por ahora, al menos. ¿Quién sabe si no quiere filtrar los datos en todas las filas?)

¿Hay otra forma de hacerlo? Si no, ¿cuál de mis soluciones debería elegir? ¿Algún comentario perspicaz?

¡Muchas gracias de antemano!

Respuesta

3

maybe sorting TreeTable following way(s), por aephyr, por cierto este Guru oscilación juega con Nimbus aspecto y la sensación también, código de divertido Nimbus incluido

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

Gracias! He navegado por las fuentes de TreeTable y debo decir que esto parece prometedor. Trataré de verlo mejor más tarde :) – ixM

+1

La solución de Aephyr funciona bien, pero el código fuente prácticamente no contiene documentación ni comentarios. La demostración es un buen ejemplo, pero todavía encontré varias excepciones lanzadas en el EDT. Los dolores de cabeza de depurar y apoyar estos y futuros problemas en código como este es un gran desacuerdo para mí. – Nate

+0

@nate esto es una exhibición de código por uno de los grandes gurús de Swing, depósitos de código para varios foros donde aephyr son miembros, ni idea sobre excepciones EDT ni violaciones, debe haber un problema secundario de su código :-) – mKorbel

1

logré hacerlo jugando en el nivel de nodos.Este es un método que he creado en mi nodo de tabla árbol que se extiende 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()); 
    } 
} 

Espero que esto ayude a alguien más, ya que creo que el primer partido de hilo ya lo descubrió.

Cuestiones relacionadas