我有一个非常简单的JTable,我想按列0升序对其进行排序。代码非常简单。但是它不能正确地对行进行排序。我不知道怎么了。以下是我的代码:
package test; import java.util.List; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.RowSorter; import javax.swing.SortOrder; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.table.TableRowSorter; public class TableSorter { public static void main(String[] args) { new TableSorter(); } public TableSorter() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } DefaultTableModel model = new DefaultTableModel(new String[] {"X", "Y", }, 0); model.addRow(new Object[]{5, 8}); model.addRow(new Object[]{10, 5}); model.addRow(new Object[]{50, 60}); model.addRow(new Object[]{100, 60}); JTable table = new JTable(model); TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel()); table.setRowSorter(sorter); List<RowSorter.SortKey> sortKeys = new ArrayList<>(); sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING)); sorter.setSortKeys(sortKeys); JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JScrollPane(table)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } }
这是我运行程序时的结果
结果:
X y 10 5 100 60 5 8 50 60
任何帮助将不胜感激。结果附后。提前致谢。
从DefaultTableModel的文档中:
警告:DefaultTableModel返回Object的列类。当将DefaultTableModel与TableRowSorter一起使用时,这将导致toString的广泛使用,这对于非String数据类型而言是昂贵的。如果将DefaultTableModel与TableRowSorter一起使用,则强烈建议重写getColumnClass以返回适当的类型。
您需要像这样重写表模型的getColumnClass:
DefaultTableModel model = new DefaultTableModel(new String[] {"X", "Y", }, 0) { @Override public Class<?> getColumnClass(int column) { Class<?> returnValue; if ((column >= 0) && (column < getColumnCount())) { returnValue = getValueAt(0, column).getClass(); } else { returnValue = Object.class; } return returnValue; }; };
在您的情况下,它是Integer.toString()对整数进行比较,因此您会看到错误的顺序。通过重写getColumnClass()为返回Integer类型,您将获得整数与它们的值的比较。
Integer.toString()
getColumnClass()
Integer