我正在使用TableRowSorter对JTable中的DefaultTableModel进行排序。我已经用过代码了
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(itemTableModel);
itemsTable.setRowSorter(sorter);
当我单击表列标题时,它会对其进行排序,但不是很好。假设我有列"Price",我点击标题对它进行排序,它会正确地对一些行进行排序,但有时会添加不应该在那里的行。例如:
PRICE: (Ascending)
0.59
1.29
25.9
200.99 (not supposed to be here)
32.99
45
8.95 (also not supposed to fit there)
因此,基本上这里发生的情况是,它没有正确地整理价格。即使它应该按升序排序,它也是不正确的。我该如何着手解决这个问题呢?如果任何人有一个答案,如果他们能解释它,那就太好了。
发布于 2018-10-23 01:29:29
根据列的类对列进行排序,该类由模型的getColumnClass method定义。
如果不覆盖模型中的getColumnClass方法,则每个列的类型都为Object.class,这意味着其内容将按其string forms进行排序。
您需要编写一个覆盖getColumnClass方法的TableModel类。
通常,这是通过直接扩展AbstractTableModel来完成的:
public class ItemModel
extends AbstractTableModel {
private static final long serialVersionUID = 1;
private final List<Item> items = new ArrayList<>();
public void add(Item item) {
items.add(item);
int newRow = items.size() - 1;
fireTableRowsInserted(newRow, newRow);
}
@Override
public int getRowCount() {
return items.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int row,
int column) {
Item item = items.get(row);
switch (column) {
case 0:
return item.getName();
case 1:
return item.getPrice();
default:
throw new IllegalArgumentException(
"Invalid column: " + column);
}
}
@Override
public String getColumnName() {
switch (column) {
case 0:
return "Name";
case 1:
return "Price";
default:
throw new IllegalArgumentException(
"Invalid column: " + column);
}
}
@Override
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
// Returning a class which implements/inherits Comprable
// will cause TableRowSorter to sort
// by comparing values directly.
return Double.class;
default:
throw new IllegalArgumentException(
"Invalid column: " + column);
}
}
}
https://stackoverflow.com/questions/52933457
复制相似问题