在JTable中对双精度值进行排序

Gigab0rt:

我发现了很多与此相关的问题,但是我没有找到解决问题的简单方法。

我找不到使JTable正确对Double值排序的方法。

我扩展了AbstractTableModel以接收一个Class数组并为每列返回正确的类型:

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列使用另一个类,则不会出现任何错误,但排序仍无法按预期进行。我尝试了不同的数值类,但似乎没有一个能正确地对双精度进行排序:

@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仅包含对象,所以我在错误的类中寻找问题。

非常感谢您提供的示例,看着它们,我发现我的双打实际上是Strings,然后我可以找到转换发生的地方。

吹牛

查看此代码。它对双精度值进行排序。

在此处输入图片说明

在此处输入图片说明

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);
  }
}

我修改了此链接上给出的源代码,以便采用双精度值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章