Java JTable - 首先单击列以按降序排序

时间:2016-05-03 09:43:25

标签: java sorting jtable

我有一个Java JTable,它存储大约8000行,有10列,一切运行良好。

当我点击列标题时,整个JTable将按照第一个实例中该列中的数据按升序排序,再次单击将按降序对数据进行排序。

我想在一个特定列(双列 - 存储%')上更改此行为,以便第一次单击将按降序对数据进行排序,然后第二次单击将升序 - 因为我最感兴趣在%s最高的条目中。

这不是在首次显示表时更改原始排序顺序。该表最初按ID号(第一列)升序排序,这是我想要的。

这是关于在基于其他列重新排序时更改行为,以便第一次单击将按降序排列。

有人有任何想法吗?

2 个答案:

答案 0 :(得分:2)

    int noOfClicks = 1;
    public void arrange(){

TableRowSorter<TableModel> sorter = new TableRowSorter<>(table.getModel());
table.setRowSorter(sorter);
List<RowSorter.SortKey> sortKeys = new ArrayList<>();

int columnIndexToSort = 1;
    if (noOfClicks%2==0){ 
    //firstClick
    sortKeys.add(new RowSorter.SortKey(columnIndexToSort,   SortOrder.ASCENDING));

    }else{
   sortKeys.add(new RowSorter.SortKey(columnIndexToSort, SortOrder.DESCENDING));
    }
    ++noOfClicks;


sorter.setSortKeys(sortKeys);
sorter.sort();    

    }

你可以用上面的方法来做。如果你可以存储noOfclicks 然后你可以检查你是否应该通过按顺序或降序排列它。如果noOfclicks是偶数,那么你可以按照订单排列表。点击的次数将在每次点击时增加+1。

答案 1 :(得分:1)

我扩展了TableRowSorter类以获得所需的效果。在我的情况下,我想先排序所有列,除了第一列。以下代码允许指定哪些列应首先按升序排序。

/** Class sorting table descending on first click unless column is specified
 * in constructor to follow standard behaviour (ascending on first click).
 * @author Adam Jagosz */
class NormallyDescendingSorter extends TableRowSorter {

    /** columns to be sorted in a standard way, ascending on first click */
    ArrayList<Integer> ascendingColumns;

    /** Constructor
     * @param model table model to be sorted
     * @param ascendingColumns columns to follow ascending sort on first click */
    public NormallyDescendingSorter(TableModel model, int... ascendingColumns) {
        super(model);
        this.ascendingColumns = new ArrayList<>();
        for (int index = 0; index < ascendingColumns.length; index++)
        {
            this.ascendingColumns.add(ascendingColumns[index]);
        }
    }

    /**
     * Method sorting table rows upon clicking on column header
     * @param column column to sort by */
    @Override
    public void toggleSortOrder(int column) {
        if(ascendingColumns.contains(column)) {
            super.toggleSortOrder(column);
            return;
        }
        ArrayList<SortKey> sortKeys = new ArrayList<>(getSortKeys());
        if(sortKeys.isEmpty() || sortKeys.get(0).getColumn() != column) {
            sortKeys.add(0, new RowSorter.SortKey(column, SortOrder.DESCENDING));
        }
        else if (sortKeys.get(0).getSortOrder() == SortOrder.ASCENDING) {  
            sortKeys.removeIf(key -> key.getColumn() == column);
            sortKeys.add(0, new RowSorter.SortKey(column, SortOrder.DESCENDING));
        }
        else {
            sortKeys.removeIf(key -> key.getColumn() == column);
            sortKeys.add(0, new RowSorter.SortKey(column, SortOrder.ASCENDING));
        }
        setSortKeys(sortKeys);
    }
}

您可以这样使用:

DocumentTableModel model = new DocumentTableModel(document);
JTable table = new JTable(model);
NormallyDescendingSorter sorter = new NormallyDescendingSorter(model, 0);
table.setRowSorter(sorter);

(我指定0作为列索引以升序排序)。