0

JFileChooserから選択したファイルに関する情報を表示するためにJTableを使用しています。[アップロード]ボタンをクリックすると、実際のアップロードはテーブルから選択したファイルを取得することから始まり、対応するファイルのJTableでファイルのアップロードステータスを更新しようとします。ここで、ファイルのアップロードの進行中にJTableのステータスフィールドの値を更新しようとすると、数回だけ更新されます.0から始まり、直接100を更新していますが、他の進行状況の値を表示できません。次のコードをご覧ください。

私のテーブルコード:

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

        }
    };

これを達成するために私に親切に提案してください。

4

1 に答える 1

1

IProgressHandlerがEDTで実行されているようです。そのため、アップロードが完了するまでGUIは再描画できません。

Swingの並行性に関するSwingチュートリアルのセクションをお読みください。このタスクにはおそらくSwingWorkerを使用する必要があります。

于 2013-03-25T16:05:19.997 に答える