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.
futuros lectores:!. Ahorrar un poco de tiempo y [desplazarse hacia abajo] (http://stackoverflow.com/a/29743777/309308) –