有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JTable中对双值进行排序

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

我找不到一种方法使我的JTable sort正确地加倍

我扩展了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进行排序:

@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];
}

我不确定我需要的是实现一个自定义行排序器、一个自定义CellRenderer,还是两者兼而有之

有人能指导我如何用更简单的方法解决这个问题吗

非常感谢并致以最良好的问候

编辑:已解决

很难说问题出在哪里

包含Object[]行的ArrayList是使用getString(int)而不是getObject(int)或getDouble(int)从数据库结果集填充的,因此渲染器无法将该值用作Double。奇怪的是,它没有给出使用Integer或Number作为列类的异常,但它被排序为字符串。我在错误的类中寻找问题,因为我确信我的ArrayList只包含对象

非常感谢你的例子,看着它们,我注意到我的双打实际上是弦,然后我可以找到转换发生的地方


共 (2) 个答案

  1. # 1 楼答案

    看看这个代码。它对双重值进行排序

    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给出的源代码进行了一点修改,使其采用双值

  2. # 2 楼答案

    这段代码可能是你的SSCCE,你能说明你对这段代码的看法吗,你发布的代码中没有任何内容

    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class TableTest2 {
    
        public void initGUI() {
            String[] columnNames = {"numbers","double", "text"};
            Object[][] data = {{1, 0.81, "A"}, {10, 5.268752005, "B"}, {7, 100.0,"C"},{6, 52.879999, "A"},
            {4, 62.50, "B"}, {2, 854.9999, "C"},{11, 19.01, "A"}, {100, 0.0009, "B"}, {20, 100.09, "C"}};
            JTable table = new JTable(new DefaultTableModel(data, columnNames) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public java.lang.Class<?> getColumnClass(int c) {
                    return getValueAt(0, c).getClass();
                }
            });
            table.setAutoCreateRowSorter(true);
            table.getRowSorter().setSortKeys(Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING)));
            JFrame frame = new JFrame("LFIXimate");
            frame.setResizable(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new JScrollPane(table));
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new TableTest2().initGUI();
                }
            });
        }
    }