Javafx: Re-sorting a column in a TableView

前端 未结 8 1783
春和景丽
春和景丽 2020-12-09 05:22

I have a TableView associated to a TreeView. Each time a node in the TreeView is selected, the TableView is refreshed with different data.

I am able to sort any col

8条回答
  •  鱼传尺愫
    2020-12-09 05:52

    Marco Jakob's answer is good for most cases, but I found that I needed to create a comparator that matches the table sort order for more flexibility. You can then use any method that takes a comparator to do sorting, searching, etc. To create the comparator, I extended that ComparatorChain class from apache's Common-Collections to easily do multiple column sorting. It looks like this.

    public class TableColumnListComparator extends ComparatorChain {
        public TableColumnListComparator(ObservableList 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;
            }
        }
    }
    

    You can then sort at anytime with

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

    I use this to sort multiple lists with the same sort, sort on background threads, do efficient updates without resorting the whole list, etc. I think there are going to be some improvements to table sorting in Javafx 8 so this won't be necessary in the future.

提交回复
热议问题