JXTable неправильная сортировка

Я использую 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();
   }
}

Что я могу сделать, чтобы он сортировался в правильном порядке по возрастанию по значению?


person dberm22    schedule 17.11.2014    source источник
comment
Можете ли вы предоставить TableModel? Кажется, к ним относятся как к String...   -  person MadProgrammer    schedule 17.11.2014
comment
@MadProgrammer Обновлено. То, что у меня было изначально, было его телом. Это единственная функция в классе.   -  person dberm22    schedule 17.11.2014
comment
Добавьте оператор отладки в предложение catch, убедитесь, что значения проанализированы правильно...   -  person MadProgrammer    schedule 17.11.2014
comment
Я уже сделал это (как указано в вопросе). Они есть. Я предполагаю, что они сортируются как общий объект, а не как поплавок.   -  person dberm22    schedule 17.11.2014
comment
Как вы сортируете таблицу? Рассмотрите возможность предоставления запускаемого примера, демонстрирующего вашу проблему. Это приведет к меньшей путанице и лучшим ответам.   -  person MadProgrammer    schedule 17.11.2014
comment
Это JXTable, поэтому функция встроена. Я просто нажимаю на заголовок столбца, а не программно.   -  person dberm22    schedule 17.11.2014
comment
Сделал быстрый тест, и, кажется, он работает для меня....   -  person MadProgrammer    schedule 17.11.2014
comment
@MadProgrammer Хм. Единственное, что я делаю, это добавляю его в JFrame. Странный. Вы сортируете его после показа? Сначала он отображается правильно (потому что я добавляю их последовательно), но не при применении сортировки.   -  person dberm22    schedule 17.11.2014


Ответы (1)


Хорошо, после долгих копаний я нашел две вещи: во-первых, JXTable имеет свой собственный «сортировщик строк», который оборачивает стандартные один и два, потому что DefaultTableModel возвращает Object.class по умолчанию из getColumnClass, эти вещи портятся (сортировщик SwingX пытается использовать интерфейс Comparator, но если класс объекта несопоставим, то по умолчанию используется toString)

У вас есть два варианта...

Ты сможешь...

Реализуйте getColumnClass из DefaultTableModel и верните правильную ссылку на класс...

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);
    }
});
person MadProgrammer    schedule 17.11.2014
comment
Удивительно, но первый вариант по-прежнему позволяет сортировать столбцы String. Это не дает мне 100% там, но я могу взять его отсюда. Спасибо! - person dberm22; 17.11.2014
comment
Конечно, вы должны вернуть другой класс в зависимости от столбцаIndex. - person keuleJ; 17.11.2014
comment
@keuleJ Ага, небольшая доработка, и теперь все работает. Спасибо MadProgrammer! - person dberm22; 17.11.2014