java - Java TableRowSorter 未正确排序表行
问题描述
我正在使用 TableRowSorter 对我的 JTable 中的 DefaultTableModel 进行排序。我已经使用了代码
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(itemTableModel);
itemsTable.setRowSorter(sorter);
当我单击表格列标题时,它会对其进行排序,除非不是很好。假设我有“价格”列,然后单击标题对其进行排序,它对某些行进行了正确排序,但时不时地添加一个不应该存在的行。例如:
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)
所以基本上这里发生的事情是它没有正确地整理价格。即使它应该按升序排序,它也不正确。我将如何解决这个问题?如果有人有答案,如果他们能解释一下,那就太好了。
解决方案
列根据列的类进行排序,该类由模型的getColumnClass 方法定义。
如果您不覆盖模型中的 getColumnClass 方法,则每列的类型都是 Object.class,这意味着其内容按其字符串形式排序。
您将需要编写一个覆盖 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);
}
}
}
推荐阅读
- javascript - 识别字符串中非大写专有名词的策略?
- javascript - 链接上的 jQuery 单击事件不会在 vaniila JS 中被捕获
- python - 对象没有属性,使用类
- xml - Powershell,从 XML 导入注册表值
- javascript - type="number"时获取input的ENTER点击事件
- sql - oracle条件数据转换成行和列
- java - 如何加载在 Java 中同一运行中创建的文件
- mercurial - 如何摆脱这个 Mercurial 警告?(主机安全/主机指纹)
- python-3.x - sklearn 的 log_loss 给出了 nan,而 tensorflow.losses.log_loss 有效
- android - 如何修复谷歌播放服务错误