java swing jtable swingx jxtreetable

java - Cómo hacer que una tabla JXTreeTable clasifique sus elementos principales



swing jtable (2)

tal vez clasificando TreeTable siguiendo las formas , por aephyr, por cierto este Swing Guru jugado con Nimbus Look and Feel también, código para Nimbus gracioso incluido

Soy consciente (he consultado las fuentes;)) que la ordenación en JXTreeTable ha sido deshabilitada.

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

Digamos que tengo 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 ordenar las 3 columnas solo en los nodos de primer nivel. Digamos que quiero ordenarlo por fecha ascendente, terminaría 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 . . .

En mi opinión, se basa en la clasificación simple de tablas (por lo que la limitación jerárquica invocada para deshabilitar la ordenación se elimina).

Veo 2 posibilidades para hacer eso:

  1. Vuelva a habilitar el mecanismo de clasificación disponible en JXTable para beneficiarse de todo lo que ya está implementado (clasificador, clasificación haciendo clic en los encabezados, ...) y solo clasifique los nodos del primer nivel (ya que sus hijos aún tendrían el mismo elemento primario) .
  2. Implementar las cosas básicas que necesito (clasificando haciendo clic en los encabezados en su mayoría), tener una lista de ids de filas de modelo en JXSortableTreeModel que ordeno y anulo convertRowIndexToModel que permitiría (creo) mostrar mi elemento ordenado como quiero.

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 el segundo, 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 manera de ir? Si no, ¿cuál de mis soluciones debería elegir? ¿Algún comentario perspicaz?

¡Muchas gracias de antemano!


Logré hacerlo jugando en el nivel de nodos. Este es un método que creé en mi nodo de tabla de árbol que 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 abridor de subprocesos ya lo descubrió.