Java应用中JTable整数排序异常问题求助
JTable整数列实现正确数值排序的解决方案
问题现状
当前JTable对整数列的排序结果为字符串字典序:
99 989 983 98
预期的正确数值排序结果应为:
989 983 99 98
问题根源
你重写getColumnClass指定列类型为Integer.class的思路是对的,但模型中存储的数据本质还是字符串类型。JTable的RowSorter排序时,会优先使用模型实际存储的数据类型进行比较,而非getColumnClass返回的类型。你的dataArray是String[][],所以排序时会按字符串的字典规则处理,导致排序错误。
两种可行解决方案
方案1:转换数据存储类型
将原String[][]数据转换为Object[][],把需要排序的列的字符串数值转为Integer类型存入模型:
private void populateTable(String[][] dataArray, String[] columnNames) { // 转换数据数组,将非第一列的字符串转为Integer对象 Object[][] convertedData = new Object[dataArray.length][dataArray[0].length]; for (int row = 0; row < dataArray.length; row++) { convertedData[row][0] = dataArray[row][0]; // 第一列保留原字符串 for (int col = 1; col < dataArray[row].length; col++) { convertedData[row][col] = Integer.parseInt(dataArray[row][col]); } } DefaultTableModel tableModel = new DefaultTableModel(convertedData, columnNames) { @Override public Class getColumnClass(int columnIndex) { return columnIndex == 0 ? Object.class : Integer.class; } }; tableStatistics.setAutoCreateRowSorter(true); tableStatistics.setModel(tableModel); }
方案2:重写getValueAt方法返回数值类型
不修改原数据结构,而是在模型的getValueAt方法中,将指定列的字符串转为Integer后返回:
private void populateTable(String[][] dataArray, String[] columnNames) { DefaultTableModel tableModel = new DefaultTableModel(dataArray, columnNames) { @Override public Class getColumnClass(int columnIndex) { return columnIndex == 0 ? Object.class : Integer.class; } @Override public Object getValueAt(int row, int column) { if (column != 0) { // 将字符串转为Integer返回,供排序逻辑使用 return Integer.parseInt((String) super.getValueAt(row, column)); } return super.getValueAt(row, column); } }; tableStatistics.setAutoCreateRowSorter(true); tableStatistics.setModel(tableModel); }
注意:方案2需要确保非第一列的所有字符串都能正确转为整数,否则会抛出
NumberFormatException,建议添加异常处理逻辑。
内容的提问来源于stack exchange,提问作者David Morgan
相关产品推荐
相关产品推荐

