2012-06-19 117 views
13

Tengo un TableView asociado a un TreeView. Cada vez que se selecciona un nodo en TreeView, TableView se actualiza con datos diferentes.Javafx: Reordenar una columna en un TableView

Puedo ordenar cualquier columna en TableView, simplemente presionando el encabezado de columna correspondiente. Eso funciona bien

Pero: cuando selecciono un nodo diferente en la vista en árbol, aunque los encabezados de columna siguen mostrándose como ordenados. Los datos no son

¿Hay alguna forma de aplicar programáticamente el orden de clasificación realizado por el usuario cada vez que cambian los datos?

+0

futuros lectores:!. Ahorrar un poco de tiempo y [desplazarse hacia abajo] (http://stackoverflow.com/a/29743777/309308) –

Respuesta

15

Ok, he encontrado cómo hacerlo. Lo resumiré aquí en caso de que sea útil a los demás:

Antes de actualizar el contenido de la TableView, debe guardar el sortcolum (si existe) y el SortType:

 TableView rooms; 
     ... 
     TableColumn sortcolumn = null; 
     SortType st = null; 
     if (rooms.getSortOrder().size()>0) { 
      sortcolumn = (TableColumn) rooms.getSortOrder().get(0); 
      st = sortcolumn.getSortType(); 
     } 

Entonces, una vez que haya terminado de actualizar los datos en TableView, debe restaurar el estado de ordenación de columnas perdidas y realizar una ordenación.

 if (sortcolumn!=null) { 
      rooms.getSortOrder().add(sortcolumn); 
      sortcolumn.setSortType(st); 
      sortcolumn.setSortable(true); // This performs a sort 
     } 

no tomo en cuenta la posibilidad de tener varias columnas en el género, pero esto sería muy fácil de hacer con esta información.

+0

'rooms.getSortOrder() estaVacia()' haría ser más elegante que 'rooms.getSortOrder(). size()> 0'. Además, tu solución solo conserva una columna de clasificación en lugar de todas. – glglgl

+0

Se intentó esto pero se está produciendo un problema https://stackoverflow.com/questions/46160528/exception-after-retaining-sorting-column-of-tableview-in-javafx –

6

Si su TableView no se reinicializa, también puede hacer lo siguiente:

TableColumn<BundleRow, ?> sortOrder = rooms.getSortOrder().get(0); 
rooms.getSortOrder().clear(); 
rooms.getSortOrder().add(sortOrder); 
6

El ejemplo de fornacif obras, pero no si hay más de un orden de clasificación (prueba Shift-clic en una segunda columna para crear un orden de clasificación secundario).

Para hacer una re-ordenación en todas las columnas que tendría que hacer algo como esto:

List<TableColumn<Room, ?>> sortOrder = new ArrayList<>(roomTable.getSortOrder()); 
roomTable.getSortOrder().clear(); 
roomTable.getSortOrder().addAll(sortOrder); 
+0

cuando probé este código muestra el error para la parte ArratList <> (roomTable.getSortOrder()); está funcionando cuando uso ArratList > (roomTable.getSortOrder()); ¿podría explicarme el motivo – learner

+0

Creo que la sintaxis <> solo funciona para la versión posterior de Java, debe estar utilizando Java 6 o 7? –

2
respuesta de

Marco Jakob es bueno para la mayoría de los casos, pero he encontrado que necesitaba para crear un comparador que coincide el orden de clasificación de la tabla para una mayor flexibilidad. A continuación, puede usar cualquier método que tome un comparador para ordenar, buscar, etc. Para crear el comparador, amplié esa clase ComparatorChain desde Common-Collections de apache para hacer fácilmente la clasificación de múltiples columnas. Se parece a esto.

public class TableColumnListComparator extends ComparatorChain { 
    public TableColumnListComparator(ObservableList<? extends TableColumn> columns) { 
     // Get list of comparators from column list. 
     for (TableColumn column : columns) { 
      addComparator(new ColumnComparator(column)); 
     } 
    } 

    /** 
    * Compares two items in a table column as if they were being sorted in the TableView. 
    */ 
    private static class ColumnComparator implements Comparator { 

     private final TableColumn column; 

     /** 
     * Default Constructor. Creates comparator based off given table column sort order. 
     * 
     * @param column 
     */ 
     public ColumnComparator(TableColumn column) { 
      this.column = column; 
     } 

     @Override 
     public int compare(Object o1, Object o2) { 
      // Could not find a way to do this without casts unfortunately 
      // Get the value of the column using the column's cell value factory. 
      final ObservableValue<?> obj1 = (ObservableValue) column.getCellValueFactory().call(
        new TableColumn.CellDataFeatures(column.getTableView(), column, o1)); 
      final ObservableValue<?> obj2 = (ObservableValue) column.getCellValueFactory().call(
        new TableColumn.CellDataFeatures(column.getTableView(), column, o2)); 
      // Compare the column values using the column's given comparator. 
      final int compare = column.getComparator().compare(obj1.getValue(), obj2.getValue()); 
      // Sort by proper ascending or descending. 
      return column.getSortType() == TableColumn.SortType.ASCENDING ? compare : -compare; 
     } 
    } 
} 

A continuación, puede ordenar en cualquier momento con

Collections.sort(backingList, new TalbeColumnListComparator(table.getSortOrder()); 

Lo utilizo para ordenar varias listas con la misma clase, tipo, en las discusiones de fondo, hacer cambios eficientes sin recurrir toda la lista, etc. Creo que habrá algunas mejoras en la clasificación de tablas en Javafx 8, por lo que no será necesario en el futuro.

11

que tenían el mismo problema y descubrió que después de una actualización de los datos es suficiente con llamar a la función sort() en la vista de tabla:

TableView rooms; 
... 
// Update data of rooms 
... 
rooms.sort() 

La vista de tabla conoce las columnas para ordenar tanto la función de clasificación ordenará los datos nuevos en el orden deseado. Esta función solo está disponible en Java 8.

3

Si utiliza el método TableView.setItems(), parece restablecer varios aspectos de TableView. Deje el ObservableList en TableView en su lugar, borre sus contenidos y luego agregue sus nuevos elementos. Entonces, TableView.sort() aún sabrá qué columnas se ordenaron previamente y funcionará. De esta manera:

tableView.getItems().clear(); 
    tableView.getItems().addAll(newTableData); 
    tableView.sort(); 
Cuestiones relacionadas