我发现了很多与此相关的问题,但我还没有找到解决问题的简单方法。
我找不到使我的 JTable 正确排序 Double 值的方法。
我扩展了 AbstractTableModel 以接收一个类数组并返回每列的正确类型:
class TableModelMod extends AbstractTableModel{
private ArrayList data;
private String [] headers;
private Class [] types;
TableModelMod(String [] heads, ArrayList datas, Class [] classes){
headers = heads;
data = datas;
types = classes;
}
...
@Override public Class getColumnClass(int c){
if (c > types.length - 1)
return null;
else
return types[c];
}
...
然后在我的自定义 JTable 构造函数中:
TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel());
但是我在添加行时遇到了这个错误:
java.lang.IllegalArgumentException: Cannot format given Object as a Number
它在方法 DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos)
上失败,该方法接受除 Double 以外的大多数数字类型。
如果我为 Double 列使用另一个类,我不会收到任何错误,但排序仍然无法按预期进行。我尝试了不同的数字类,但似乎没有一个能正确地对 double 进行排序:
@Override public Class getColumnClass(int c){
if (c > types.length - 1)
return null;
else if (types[c] == Double.class)
return Number.class;
else
return types[c];
}
我不确定我需要的是实现自定义 RowSorter、自定义 CellRenderer 还是两者兼而有之。
有人可以指导我如何更简单地解决这个问题吗?
非常感谢和最诚挚的问候。
已编辑:已解决
很难说出问题出在哪里。
包含 Object[] 行的 ArrayList 是使用 getString(int) 而不是 getObject(int) 或 getDouble(int) 从数据库 ResultSet 填充的,因此该值不能被呈现器用作 Double。奇怪的是它没有使用 Integer 或 Number 作为列类给出异常,但无论如何它都被排序为 String。我一直在寻找错误类中的问题,因为我确信我的 ArrayList 只包含对象。
非常感谢您提供的示例,看着它们我注意到我的 double 实际上是字符串,然后我可以找到转换发生的位置。
最佳答案
检查这段代码。它对 double 值进行排序。
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class RowSorterDemo {
public static void main(String args[]) {
JFrame frame = new JFrame("Sort Table Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object rows[][] = { { "J", 23.1 }, { "R", 21.1, }, { "E", 21.2, }, { "B", 27.1, }, { "A", 25.2, },
{ "S", 22.9, }, };
String columns[] = { "Name", "Age" };
TableModel model = new DefaultTableModel(rows, columns) {
public Class getColumnClass(int column) {
Class returnValue;
if ((column >= 0) && (column < getColumnCount())) {
returnValue = getValueAt(0, column).getClass();
} else {
returnValue = Object.class;
}
return returnValue;
}
};
JTable table = new JTable(model);
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
JScrollPane pane = new JScrollPane(table);
frame.add(pane, BorderLayout.CENTER);
frame.setSize(300, 150);
frame.setVisible(true);
}
}
我修改了这个 link 给出的来源一点点,以便它采用双倍值。
关于java - 在 JTable 中对 double 值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7299289/