为什么我的JTable错误地排序整数列?

我有一个使用DefaultTableModel的JTable,我允许在用户点击列标题时进行排序。 但是,当用户单击具有integer类型数据的列的标头时,它不会正确排序。 它似乎是按String而不是整数类型排序。

这是我的代码中我实际将数据添加到表中的部分:

DefaultTableModel aModel = (DefaultTableModel) mainView.logEntryTable.getModel(); ResultSetMetaData rsmd; try { mainView.logEntriesTableModel.setRowCount(0); rsmd = rs.getMetaData(); int colNo = rsmd.getColumnCount(); while(rs.next()){ Object[] objects = new Object[colNo]; for(int i=0;i<colNo;i++){ objects[i]=rs.getObject(i+1); } aModel.addRow(objects); count++; } mainView.logEntryTable.setModel(aModel); mainView.logEntryTable.getColumnModel().getColumn(0).setMaxWidth(80); 

所以我试图覆盖那个方法并最终得到这个:

  @Override public Class getColumnClass(int columnIndex){ if( columnIndex == 0){ // Return the column class for the integer column }else{ // Return the column class like we normally would have if we didn't override this method } return null; } }; 

我以前从来没有覆盖过这个,我不太确定我在这里做什么。

试试这个小例子。

排序第1列

更好的方法

正如Kleopatra所建议的那样,定义与每个列相关的列类就足以使数据正确排序。

 import javax.swing.*; import javax.swing.table.*; import java.util.Comparator; class TableSorting { public static void main(String[] args) { Object[][] data = { {new Integer(1), "Don't Let Go", new Integer(179)}, {new Integer(2), "Photograph", new Integer(29)}, {new Integer(3), "Hash Pipe", new Integer(186)}, {new Integer(4), "Island In The Sun", new Integer(200)}, {new Integer(5), "Crab", new Integer(154)}, {new Integer(6), "Knock-Down Drag-Out", new Integer(128)}, {new Integer(7), "Smile", new Integer(158)}, {new Integer(8), "Simple Pages", new Integer(176)}, {new Integer(9), "Glorious Day", new Integer(160)}, {new Integer(10), "O Girlfriend", new Integer(230)} }; Object[] columns = {"Track #", "Title", "Length"}; DefaultTableModel model = new DefaultTableModel(data,columns) { @Override public Class getColumnClass(int column) { switch (column) { case 0: return Integer.class; case 1: return String.class; case 2: return Integer.class; default: return String.class; } } }; JTable table = new JTable(model); JScrollPane scroll = new JScrollPane(table); table.setAutoCreateRowSorter(true); JOptionPane.showMessageDialog(null, scroll); } } 

原来,使用比较器

 import javax.swing.*; import javax.swing.table.*; import java.util.Comparator; class TableSorting { public static void main(String[] args) { Object[][] data = { {new Integer(1), "Don't Let Go", new Integer(179)}, {new Integer(2), "Photograph", new Integer(29)}, {new Integer(3), "Hash Pipe", new Integer(186)}, {new Integer(4), "Island In The Sun", new Integer(200)}, {new Integer(5), "Crab", new Integer(154)}, {new Integer(6), "Knock-Down Drag-Out", new Integer(128)}, {new Integer(7), "Smile", new Integer(158)}, {new Integer(8), "Simple Pages", new Integer(176)}, {new Integer(9), "Glorious Day", new Integer(160)}, {new Integer(10), "O Girlfriend", new Integer(230)} }; Object[] columns = {"Track #", "Title", "Length"}; JTable table = new JTable(data, columns); JScrollPane scroll = new JScrollPane(table); DefaultTableModel model = new DefaultTableModel(data,columns); TableRowSorter trs = new TableRowSorter(model); class IntComparator implements Comparator { public int compare(Object o1, Object o2) { Integer int1 = (Integer)o1; Integer int2 = (Integer)o2; return int1.compareTo(int2); } public boolean equals(Object o2) { return this.equals(o2); } } trs.setComparator(0, new IntComparator()); table.setRowSorter(trs); scroll = new JScrollPane(table); table.setAutoCreateRowSorter(false); JOptionPane.showMessageDialog(null, scroll); } } 

好吧,DefaultTableModel的文档做了以下状态:

警告:DefaultTableModel返回Object的列类。 当DefaultTableModel与TableRowSorter一起使用时,这将导致广泛使用toString,对于非String数据类型来说,这是非常昂贵的。 如果将DefaultTableModel与TableRowSorter一起使用,强烈建议您覆盖getColumnClass以返回适当的类型。

所以听起来它只是将值转换为字符串,这与您所看到的一致。

您是否尝试重写getColumnClass()或为相应的TableRowSorter调用setComparator()

答案如下: JTable排序整数值的问题

我们的想法是为列定义类。

 myTable.setModel(new DefaultTableModel(Object[][] tableData, String[] columnsNames){ Class[] types = { Boolean.class, Boolean.class, String.class, String.class }; @Override public Class getColumnClass(int columnIndex) { return this.types[columnIndex]; } });