JTable排序整数值的问题

目前我有一个使用RowSorterJTable ,但当我点击我希望它排序的标题时,它会以奇怪的顺序显示行

  • 1
  • 10
  • 11
  • 2
  • 20
  • 21
  • 3
  • 三十

然而,当我选择某一行时,比如第5行,它会更改标记为5的行。任何理由为什么会发生这种情况以及如何解决它?

您可以通过显式设置其模型来设置JTable的列类型,如下例所示

 setModel(new DefaultTableModel(new Object[0][], new String[] { "SELECT", "WHERE", "FIELD", "TYPE" }) { Class[] types = { Boolean.class, Boolean.class, String.class, String.class }; boolean[] canEdit = { true, false, false, false }; @Override public Class getColumnClass(int columnIndex) { return this.types[columnIndex]; } public boolean isCellEditable(int columnIndex) { return this.canEdit[columnIndex]; } }); 

像这样给你的列类(这里第一列和第二列是布尔值,其余是String。

  Class[] types = { Boolean.class, Boolean.class, String.class,String.class }; 

您将行内容视为文本。 您的排序顺序是字母而不是数字。 如果您将内容视为数字,它应该自行解决。

要扩展@aaamos的答案,请validation您的TableModelgetColumnClass()返回Number.class (或合适的子类getColumnClass() 。 这里有一个相关的例子。

为了满足您的要求,您只需设置Comparator for RowSorter,以便在对指定列进行排序时使用。 代码有点像下面:

 table.setAutoCreateRowSorter(true); TableRowSorter rowSorter = (TableRowSorter)table.getRowSorter(); rowSorter.setComparator(5, new Comparator() { @Override public int compare(String o1, String o2) { return Integer.parseInt(o1) - Integer.parseInt(o2); } }); 

您必须将以下代码添加到不将列排序为整数的实际代码中。

构建JTable的实际代码是:

 DefaultTableModel modeloT = new DefaultTableModel(); // But Sorts the column of numbers in wrong way. 1,11,2,25,...... 

解:

 DefaultTableModel modeloT = new DefaultTableModel() { // Defining the type of column on your JTable. I wish sort my second column as a numeric (1,2,11), not String (1,11,2). For that I defined the second class as Integer. Class[] types = { String.class, Integer.class, String.class }; boolean[] canEdit = new boolean [] { false, false, false }; // You must add this Override in order to works sorting by numeric. @Override public Class getColumnClass(int columnIndex) { return this.types[columnIndex]; } // This override is just for avoid editing the content of my JTable. @Override public boolean isCellEditable(int row, int column) { return false; } }; 

我也在努力实现你想要做的事情,我努力去理解如何自己做。 我实现“正确”排序的方式是这样的:

 DefaultTableModel model = new DefaultTableModel(row, col){ @Overrride public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } });