2

我正在使用 JXTable 来显示、过滤和排序一些数据。但是,我在排序时遇到了一些意外行为。如您所见,这些值没有按预期升序,而是按字符串的排序方式排序。

为了解决这些评论,我确信在代码的正确部分(即 Float.valueOf() 块)中解析了此列。我通过调试知道这一点。此外,我通过单击 jxtable 的标题对列进行排序。我不是以编程方式进行的。

不正确的排序顺序

为了清楚起见,我将它们添加为浮点数:

class FantasyProTableModel extends DefaultTableModel
{
   void loadData() throws BiffException, IOException
   {
      Workbook workbook = Workbook.getWorkbook(new File("Input.xls"));
      Sheet sheet = workbook.getSheet(0);

      int numCols = sheet.getColumns();
      for(int col=0;col<numCols;col++)
      {
          addColumn(sheet.getCell(col,0).getContents());
      }
      for(int rownum=1;rownum<sheet.getRows();rownum++)
      {
          Object[] row = new Object[numCols];
          for(int col=0;col<numCols;col++)
          {
              try
              {
                  row[col] = Float.valueOf(sheet.getCell(col,rownum).getContents());
                                 //parseFloat() doesn't work either
              }
              catch(NumberFormatException e)
              {
                  row[col] = sheet.getCell(col,rownum).getContents();
              }
          }
          addRow(row);
      }

      workbook.close();
   }
}

我该怎么做才能让它按值按正确的升序排序?

4

1 回答 1

4

好的,经过大量挖掘,我发现了两件事,一,JXTable有它自己的“行排序器”,它包装了默认的一和二,因为默认DefaultTableModel返回Object.classfrom getColumnClass,这些东西都搞砸了(SwingX 的排序器试图让使用Comparator接口,但如果对象类不可比较,则默认使用toString)

你有两个选择...

你可以...

实现getColumnClassfromDefaultTableModel并返回正确的类引用...

DefaultTableModel model = new DefaultTableModel(0, 1) {
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return Float.class;
    }
};

或者你可以...

提供您自己的JXTable行排序器实现比较器...

((TableSortController)table.getRowSorter()).setComparator(0, new Comparator<Float>() {
    @Override
    public int compare(Float o1, Float o2) {
        return o1.compareTo(o2);
    }
});
于 2014-11-17T06:07:28.477 回答