JTable排序整数值的问题
目前我有一个使用RowSorter
的JTable
,但当我点击我希望它排序的标题时,它会以奇怪的顺序显示行
- 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您的TableModel
从getColumnClass()
返回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(); } });