2014-11-17 9 views
2

Я использую JXTable для отображения, фильтрации и сортировки некоторых данных. Однако при сортировке я получаю некоторое неожиданное поведение. Как вы можете видеть, значения не растут, как ожидалось, но отсортированы как сортировка строки.JXTable Неверная сортировка

Чтобы ответить на комментарии, я уверен, что этот столбец разбирается в правильной части кода (т. Е. В блоке Float.valueOf().) Я знаю это путем отладки. Кроме того, я сортирую столбец, щелкнув заголовок jxtable. Я не делаю это программно.

Incorrect Sort Order

Просто чтобы быть ясно, я добавляю их в качестве поплавков:

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

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

+0

Можете ли вы предоставить 'TableModel'? Кажется, что их обрабатывают как «String» ... – MadProgrammer

+0

@MadProgrammer Обновлено. Первоначально я был ее телом. Это единственная функция в классе. – dberm22

+0

Добавьте инструкцию debug в предложение catch, убедитесь, что значения правильно проанализированы ... – MadProgrammer

ответ

4

Хорошо, после того, как много копания, я обнаружил две вещи, одна, 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); 
    } 
}); 
+0

Удивительно, но первый вариант по-прежнему позволяет сортировать столбцы String. Они не получают меня на 100%, но я могу взять это отсюда. Благодаря! – dberm22

+2

Конечно, вы должны вернуть другой класс в зависимости от столбцаIndex. – keuleJ

+0

@keuleJ Yup, некоторые мелкие настройки и теперь это работает. Спасибо, MadProgrammer! – dberm22