0

我正在使用 JTable 来显示有关从 JFileChooser 中选择的文件的信息。当我点击上传按钮时,我的实际上传将从表中选取选定的文件开始,它会尝试更新 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 回答