重写getColumnClass方法后,jTable仍会错误地对数字进行排序

时间:2014-07-17 16:11:42

标签: java sorting jtable numbers integer

我正在尝试制作我的jTable排序数字,但它仍然不起作用。我不确定我做错了什么,但一切似乎都没问题。

我的代码:     public static 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类,它包含整数对象,所以我把它排序为String”。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

您正在正确处理问题,但我怀疑您初始化表格的方式或者未显示的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;
}

如果用下面的代码片段替换你的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;
    }

};

希望这有帮助。