2013-03-25 3 views
0

JFileChooser에서 선택한 파일에 대한 정보를 표시하기 위해 JTable을 사용하고 있습니다. 업로드 버튼을 클릭하면 실제 업로드가 테이블에서 선택된 파일을 선택하여 시작되며 JTable에서 해당 파일에 대한 파일 업로드 상태를 업데이트하려고 시도합니다. 여기에서는 파일 업로드가 진행 중일 때 JTable의 상태 필드 값을 업데이트하려고 할 때 몇 번만 업데이트됩니다. 0부터 시작하여 100을 직접 업데이트하지만 다른 진행률 값을 볼 수는 없습니다. . , 다음 코드로 봐주십시오JTable 셀이 정기 업데이트로 업데이트되지 않습니다.

내 표 코드 :

uploadTableModel = new UploadTabModel(); 
uploadTable = new JTable(uploadTableModel); 
uploadTable.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN); 
uploadTable.setAutoCreateRowSorter(false); 
uploadTable.setShowGrid(false); 
uploadTable.setVisible(true); 
JScrollPane tablePane = new JScrollPane(); 
tablePane.setViewportView(uploadTable); 

내 테이블 모델 :

public class UploadTabModel extends AbstractTableModel { 

    private List<String> names = new ArrayList<String>(); 
    private List<FileDTO> data = new ArrayList<FileDTO>(); 
    public CMUploadTabModel() { 

     names.add("Name"); 
     names.add("Size"); 
     names.add("Status"); 
    } 
    private static final long serialVersionUID = 3151839788636790436L; 

    @Override 
    public int getColumnCount() { 
     return names.size(); 
    } 

    @Override 
    public int getRowCount() { 
     // TODO Auto-generated method stub 
     return data.size(); 
    } 

    @Override 
    public Object getValueAt(int row, int col) { 
     FileDTO file = data.get(row); 
     switch (col) { 
     case 0: 
      return file.getFileName(); 
     case 1: 
      return file.getSize(); 
     case 2: 
      return file.getStatus(); 
     } 
     return file.getFileName(); 
    } 

    @Override 
    public void setValueAt(Object arg0, int rowIndex, int columnIndex) { 
     FileDTO file = data.get(rowIndex); 
     switch (columnIndex) { 
      case 2: 
       file.setStatus((Integer) arg0); 
       break; 
     } 
    } 

    public void addRow(FileDTO file) { 
     this.data.add(file); 
     this.fireTableRowsInserted(data.size() - 1, data.size() - 1); 
    } 

    public String getColumnName(int columnIndex) { 
     return names.get(columnIndex); 
    } 


    @Override 
    public Class<?> getColumnClass(int index) { 
     return getValueAt(0, index).getClass(); 
    } 
    public void updateProgress(int index, final int percentage) { 

     FileDTO file = data.get(index); 
     file.setStatus(percentage); 
     data.set(0, file); 
     setValueAt(percentage, index, 2); 
     fireTableRowsUpdated(index, 2); 

    } 
} 

내 파일 모델 구성 요소 :

public class FileDTO { 

    private String fileName; 
    private Long size; 
    private Integer status =0; 

    public FileDTO(File file) { 

     this.fileName = file.getName(); 
     this.size = file.length(); 
    } 

//setters & getters 

핸들러는 업로드에서 테이블을 업데이트 : 내가 이것을 달성하기 위해

handler = new IProgressHandler() { 

     @Override 
     public void update(int index, int percentage) { 
      uploadTableModel.updateProgress(index,percentage); 

     } 
    }; 

친절하게 제안 해주십시오.

+0

아마도 모델과 관련이 없습니다. 모델이 setValueAt에서 알림을 보내지 않습니다. – kleopatra

답변

1

IProgressHandler가 EDT에서 실행되는 것처럼 들리므로 GUI는 업로드가 끝날 때까지 자체를 다시 그릴 수 없습니다.

Concurrency in Swing의 스윙 튜토리얼의 섹션을 읽으십시오. 이 작업을 위해서는 SwingWorker를 사용해야합니다.

관련 문제