我正在尝试制作我的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”。
为什么会这样?
答案 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;
}
};
希望这有帮助。