Java 整数值的JTable排序问题
目前我有一个Java 整数值的JTable排序问题,java,swing,user-interface,sorting,jtable,Java,Swing,User Interface,Sorting,Jtable,目前我有一个JTable,它使用RowSorter,但是当我单击要排序的标题时,它会以奇怪的顺序显示行 一, 十, 十一, 二, 二十 二十一, 三, 三十 但是,当我选择某一行时,比如第5行,它会更改标记为5的行。有什么原因可以解释为什么会发生这种情况以及我如何修复它吗?您将行内容视为文本。您的排序顺序是字母顺序,而不是数字顺序。如果您将内容视为数字,它应该会自动计算出来。若要扩展@aaamos的答案,请验证您的表格模型是否从getColumnClass()返回Number.class
JTable
,它使用RowSorter
,但是当我单击要排序的标题时,它会以奇怪的顺序显示行
- 一,
- 十,
- 十一,
- 二,
- 二十
- 二十一,
- 三,
- 三十
但是,当我选择某一行时,比如第5行,它会更改标记为5的行。有什么原因可以解释为什么会发生这种情况以及我如何修复它吗?您将行内容视为文本。您的排序顺序是字母顺序,而不是数字顺序。如果您将内容视为数字,它应该会自动计算出来。若要扩展@aaamos的答案,请验证您的
表格模型是否从getColumnClass()
返回Number.class
(或合适的子类)。这里有一个相关示例。您可以通过显式设置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];
}
});
给出如下列类(这里列1和列2是布尔值,其余为字符串)
Class[] types = { Boolean.class, Boolean.class, String.class,String.class };
为了满足您的要求,您只需设置RowSorter在对指定列进行排序时使用的比较器。代码如下所示:
table.setAutoCreateRowSorter(true);
TableRowSorter<DefaultTableModel> rowSorter = (TableRowSorter<DefaultTableModel>)table.getRowSorter();
rowSorter.setComparator(5, new Comparator<String>() {
@Override
public int compare(String o1, String o2)
{
return Integer.parseInt(o1) - Integer.parseInt(o2);
}
});
table.setAutoCreateRowSorter(真);
TableRowSorter rowSorter=(TableRowSorter)table.getRowSorter();
行分类器。设置比较器(5,新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2)
{
返回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();
}
});
“当我选择某一行,比如第5行时,它会更改标记为5的行”是什么意思?显示的行是否发生变化,或者当您试图获取所选行时,您获得的是另一行?调整表格模型更好,我可以看出这种方法的表面吸引力,但@Robin是正确的:模型应包含数字类型。+1用于调整模型;数字类型也是可能的。