2013-06-17 2 views
0

JTable에서 여러 열을 추가하고 이동하는 데 문제가 있습니다.JTable에서 여러 열 이동

각 열에 특정 날짜에 대한 데이터와 열 헤더가 있습니다. 이동 자체는 모두 정상이지만 다음 열을 추가하고 이동하면 다시 설정됩니다.

프로젝트의 다른 모든 위치에서 위치를 변경하지 않았습니다. 여기

출력 (전용 헤더)의 예 :

| 5 | 6 | 7 | 8 |

추가 헤더 "1"인덱스 0으로 이동 :

| 1 | 5 | 6 | 7 | 8 |

헤더 "2"를 추가하고 색인 1로 이동 :

| 5 | 2 | 6 | 7 | 8 | 1 |

추가 헤더 "3"과 인덱스 2로 이동 : 그것을 따라

| 5 | 6 | 3 | 7 | 8 | 1 | 2 |

및 일부 코드 ("< < < <"의에 의해 지정 문제 위치) :

public void recalculateTableDates(String start, String end, Double defaultValue) {  
    String startDate = getTblDetails().getColumnName(1); 
    String endDate = getTblDetails().getColumnName(getTblDetails().getColumnCount()-1); 

    int sMonth = Integer.parseInt(start.substring(4, 6)); 
    int sYear = Integer.parseInt(start.substring(0, 4)); 
    int eMonth = Integer.parseInt(end.substring(4, 6)); 
    int eYear = Integer.parseInt(end.substring(0, 4)); 

      // gets distance between 2 values 
      // (Used elsewhere in project, working as intended) 
    int duration = getDuration(sMonth, sYear, eMonth, eYear); 

    Vector<Double> data = new Vector<Double>(duration); 

    for(int i = 0; i < data.size(); i++) { 
     data.addElement(defaultValue); 
    } 

    for(int i = 1, mCount = sMonth, yCount = sYear; i < duration+1; i++) { 
     String yyyymm = String.valueOf(yCount)+String.format("%02d", mCount++); 





        // Adds to beginning - PROBLEM HERE <<<<<<<<<<<<<<<<<<<<<<<<<< 
     if(yyyymm.compareTo(startDate) < 0) { 
      getModel().addColumn(yyyymm, data); 
      moveColumn(tblDetails.getColumnCount()-1, i); 

     } else if(yyyymm.compareTo(endDate) > 0) { 
           // THIS IF STATEMENT WORKING AS INTENDED 
        getModel().addColumn(yyyymm, data); 
     } 

     if(mCount > 12) { 
      mCount = 1; 
      yCount++; 
     } 

    } 

    int length = getTblDetails().getColumnCount()-1; 
    System.out.println(duration + " " + length); 
    if(length > duration) { 
     TableColumnModel colModel = getTblDetails().getColumnModel(); 
     for(int i = length; i > duration; i--) { 
      colModel.removeColumn(colModel.getColumn(i)); 
     } 
    } 

    this.revalidate(); 
    this.repaint(); 
} 



    // Moves column in table 
private void moveColumn(int column, int targetIndex) { 
     getTblDetails().moveColumn(column, targetIndex); 
} 

코드가 좀 지저분하다는 것을 알고 있습니다. 이걸 고치려 고 위아래으로 달려있다.

누구에게 이런 이유가 발생 했습니까? JTable에 대한 광범위한 경험이 없습니다.

+1

[SSCCE] (http://sscce.org) –

+0

내 호기심에 더 빨리 도움을 받으려면 "2"열이 JTable에 추가 된 후 "1"이 표시된 열이 끝으로 이동 한 이유는 무엇입니까? 열 "3"에 대한 논리가 ..... 또는 논리가 될 수 있습니다. – mKorbel

답변

3

열을 모델에 추가하면 테이블에 대한 TableColumns가 모델에서 다시 작성되므로 테이블에 대해 수행 된 모든 사용자 지정이 손실됩니다. 즉, 추가 된 사용자 정의 렌더러가 손실되고 열의 순서가 변경되지 않습니다.

JTable table = new JTable(...); 
table.setAutoCreateColumnsFromModel(false); 

TableColumn의가 자동으로 생성되지 않기 때문에 당신이 당신 자신과 같은 코드를 볼 수있는 작품이 작업을 수행 할 필요가 :

를 처음 테이블을 만들 때

는 다음을 수행 할 수 있습니다이를 방지하려면
String header = "Col" + (table.getColumnCount() + 1); 
model.addColumn(header); 

// AutoCreate is turned off so create table column here 

TableColumn column = new TableColumn(table.getColumnCount()); 
column.setHeaderValue(header); 
table.addColumn(column); 
+0

직접 모델에서 데이터 및 식별자 벡터를 직접 변경하여이 문제를 해결했습니다. 단순 해 보였습니다. 도와 줘서 고마워. – Skepi