2014-11-17 13 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 Updated. 내가 원래 가지고 있던 것은 시체였다. 이 클래스의 유일한 함수입니다. – dberm22

+0

catch 절에 디버그 문을 추가하고 값이 올바르게 구문 분석되었는지 확인하십시오 ... – MadProgrammer

답변

4

좋아 getColumnClass에서 기본적으로 DefaultTableModel 반환 Object.class는 이런 일이 조여지고 있기 때문에, 더 파고 후, 나는 JXTable는 기본 하나, 둘을 감싸고 자신의 "행 정렬"의이 두 가지, 하나를 발견했습니다 최대 (SwingX의 분류기는 Comparator 인터페이스의 사용을 만들려고 노력하지만, 객체 클래스는 비교할 수없는 경우, 다음 toString를 사용하여 기본값)

당신은 두 가지 선택 ... 당신이 할 수있는

이 ...

... JXTable 행 분류기 구현의 자신의 비교를 제공합니다 ... 당신이 할 수있는

DefaultTableModel에서 getColumnClass을 구현하고 적절한 클래스 참조를 반환 ...

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

또는

((TableSortController)table.getRowSorter()).setComparator(0, new Comparator<Float>() { 
    @Override 
    public int compare(Float o1, Float o2) { 
     return o1.compareTo(o2); 
    } 
}); 

+0

놀랍게도 첫 번째 옵션으로 문자열 열을 정렬 할 수 있습니다. 이것들은 나에게 거기에서 100 % 얻지 않는다. 그러나 나는 그것을 여기에서 잡을 수있다. 감사! – dberm22

+2

물론 columnIndex에 따라 다른 클래스를 반환해야합니다. – keuleJ

+0

@keuleJ 네, 약간의 미세한 조정이 가능합니다. 감사합니다 MadProgrammer! – dberm22