我有一个Java JTable,它存储大约8000行,有10列,一切运行良好。
当我点击列标题时,整个JTable将按照第一个实例中该列中的数据按升序排序,再次单击将按降序对数据进行排序。
我想在一个特定列(双列 - 存储%')上更改此行为,以便第一次单击将按降序对数据进行排序,然后第二次单击将升序 - 因为我最感兴趣在%s最高的条目中。
这不是在首次显示表时更改原始排序顺序。该表最初按ID号(第一列)升序排序,这是我想要的。
这是关于在基于其他列重新排序时更改行为,以便第一次单击将按降序排列。
有人有任何想法吗?
答案 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作为列索引以升序排序)。