【问题标题】:jTable still sorts numbers incorrectly after overriding getColumnClass method覆盖 getColumnClass 方法后,jTable 仍然错误地对数字进行排序
【发布时间】:2014-09-08 14:55:40
【问题描述】:

我正在尝试使我的 jTable 排序数字,但它仍然无法正常工作。我不确定我做错了什么,但一切似乎都很好。

我的代码: 公共静态 javax.swing.JTable jTable1;

public void fillMain() {

jTable1 = new javax.swing.JTable();

//finalcolumns is a List<String> of all my column names
//types is List<Class> of classes of my columns


    DefaultTableModel tm = new DefaultTableModel(new Object[0][], new String[] {"testcolumn1", "testcolumn2", "testcolumn3"}) {
        @Override
        public Class<?> getColumnClass(int col) {
            System.out.println("Class: " types.get(col).toString()); 
            //here it really returns the right column class (Integer.class)
            return types.get(col);
        }

        @Override
        public int getColumnCount() {
            return finalcolumns.size();
        }

        @Override
        public String getColumnName(int col) {
            return finalcolumns.get(col);
        }
    };

jTable1.setModel(tm);
jTable1.setAutoCreateRowSorter(true);

}

正如我在代码中标记的那样,我正在覆盖 DefaultTableModel 方法,并且覆盖正常工作,我覆盖的所有方法都返回正确的值。

所以它就像:TableModel 说:“此列是 Integer 类,它包含整数对象,所以我将其排序为字符串”。

为什么会这样?

【问题讨论】:

    标签: java sorting jtable numbers integer


    【解决方案1】:

    您正确地解决了问题,但我怀疑您初始化表格的方式或未显示的 finalColumns 或类型列表可能存在问题。

    实现 getColumnClass 的通用方法如下所示。这是基于Java Tutorials 中提出的建议实现,但增加了一项检查以防止具有 0 行的表模型:

    @Override
    public Class<?> getColumnClass(int col) {
    
        Class retVal = Object.class;
    
        if(getRowCount() > 0)
            retVal =  getValueAt(0, col).getClass();
    
        return retVal;
    }
    

    如果您用下面的这个 sn-p 替换您的 tm TableModel 声明/初始化,它应该提供您寻求的行为。您应该只需要更改它填充表数据和 columnHeaders 的方式。

    Object[][] data = new Object[5][3];
    
    data[0][0] = "word";
    data[1][0] = "jive";
    data[2][0] = "stuff";
    data[3][0] = "word2";
    data[4][0] = "abc";
    
    data[0][1] = new Integer(410);
    data[1][1] = new Integer(45);
    data[2][1] = new Integer(456456);
    data[3][1] = new Integer(4);
    data[4][1] = new Integer(4);
    
    String[] columnNames = new String[] {"testcolumn1", "testcolumn2"};
    
    DefaultTableModel tm2 = new DefaultTableModel(data, columnNames) {
    
        @Override
        public Class<?> getColumnClass(int col) {
    
            Class retVal = Object.class;
    
            if(getRowCount() > 0)
                retVal =  getValueAt(0, col).getClass();
    
            return retVal;
        }
    
    };
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多