java - 在 JTable 中对 double 值进行排序

标签 java swing jtable double tablerowsorter

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

我找不到使我的 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 值进行排序。

enter image description here

enter image description here

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/

相关文章:

java - 防止在编译时或运行时在项目类中使用特定注释

java - 通过 Post Android 发送数据到 PHP

java - JComboBox 从所选项目中的多个变量中获取变量

java - 无法使用 mysql "like"语句填充 jtable

java - 从另一个 JTable 的选择中创建新的 JTable?

java - 创建不需要 java 命令的 100% 独立可执行 jar

java - 如何在 XX :XX:XX time? 处运行方法

java - 如何将图像渲染到 JTable 单元格

java - 如何在Swing中画蛇?

java - 在 Swing MDI 中管理 JInternalFrames