Java 在重写getColumnClass方法后,jTable仍然对数字进行错误排序
我正在尝试生成我的jTable排序编号,但它仍然不起作用。我不确定我做错了什么,但一切似乎都很好 我的代码: 公共静态javax.swing.JTable jTable1Java 在重写getColumnClass方法后,jTable仍然对数字进行错误排序,java,sorting,jtable,numbers,integer,Java,Sorting,Jtable,Numbers,Integer,我正在尝试生成我的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
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);
}
public void fillMain(){
jTable1=newjavax.swing.JTable();
//finalcolumns是我所有列名的列表
//类型是我的列的类列表
DefaultTableModel tm=新的DefaultTableModel(新对象[0][],新字符串[]{“testcolumn1”、“testcolumn2”、“testcolumn3”}){
@凌驾
公共类getColumnClass(int-col){
System.out.println(“类:”types.get(col.toString());
//在这里,它真正返回正确的列类(Integer.class)
返回类型.get(col);
}
@凌驾
public int getColumnCount(){
返回finalcolumns.size();
}
@凌驾
公共字符串getColumnName(int-col){
返回finalcolumns.get(col);
}
};
jTable1.setModel(tm);
jTable1.setAutoCreateRowSorter(真);
}
正如我在代码中标记的那样,我正在重写DefaultTableModel方法,并且重写工作正常,我重写的所有方法都返回正确的值
这就像:TableModel说:“这个列是Integer类,它包含Integer对象,所以我像字符串一样对它排序”
为什么会发生这种情况?您处理问题的方法是正确的,但我怀疑您初始化表的方式或未显示的最终列或类型列表可能存在问题 下面显示了实现getColumnClass的通用方法。这是基于中提出的建议实现,但添加了一个检查,以防止出现0行的表模型:
@Override
public Class<?> getColumnClass(int col) {
Class retVal = Object.class;
if(getRowCount() > 0)
retVal = getValueAt(0, col).getClass();
return retVal;
}
@覆盖
公共类getColumnClass(int-col){
Class retVal=Object.Class;
如果(getRowCount()>0)
retVal=getValueAt(0,col).getClass();
返回返回;
}
如果用下面的代码片段替换tm TableModel声明/初始化,它应该提供您所寻求的行为。您应该只需要更改它填充表数据和列标题的方式
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;
}
};
Object[][]数据=新对象[5][3];
数据[0][0]=“字”;
数据[1][0]=“jive”;
数据[2][0]=“资料”;
数据[3][0]=“word2”;
数据[4][0]=“abc”;
数据[0][1]=新整数(410);
数据[1][1]=新整数(45);
数据[2][1]=新整数(456456);
数据[3][1]=新的整数(4);
数据[4][1]=新的整数(4);
字符串[]columnNames=新字符串[]{“testcolumn1”,“testcolumn2”};
DefaultTableModel tm2=新的DefaultTableModel(数据、列名){
@凌驾
公共类getColumnClass(int-col){
Class retVal=Object.Class;
如果(getRowCount()>0)
retVal=getValueAt(0,col).getClass();
返回返回;
}
};
希望这有帮助