【问题标题】:JXTable Incorrect SortingJXTable 排序不正确
【发布时间】:2015-01-13 23:22:09
【问题描述】:

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

为了解决 cmets,我确信在代码的正确部分(即 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();
   }
}

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

【问题讨论】:

  • 你能提供TableModel吗?他们似乎被视为String...
  • @MadProgrammer 已更新。我原本拥有的是它的身体。这是该类中唯一的函数。
  • 在你的catch子句中添加debug语句,确保值被正确解析...
  • 我已经这样做了(如问题中所述)。他们是。我假设它们被排序为通用对象而不是浮点数。
  • 您是如何对表格进行排序的?考虑提供一个runnable example 来证明您的问题。这将导致更少的混乱和更好的响应

标签: java swing sorting swingx jxtable


【解决方案1】:

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

你有两个选择...

你可以...

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

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);
    }
});

【讨论】:

  • 令人惊讶的是,第一个选项仍然允许您对字符串列进行排序。这些不能让我 100% 到达那里,但我可以从这里得到它。谢谢!
  • 当然你应该根据 columnIndex 返回一个不同的类。
  • @keuleJ 是的,做了一些小的调整,现在它可以工作了。谢谢疯狂程序员!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多