JTable单元不会通过定期更新进行更新

时间:2013-03-25 15:29:12

标签: java swing jtable

我正在使用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);

        }
    };

请建议我实现这一目标。

1 个答案:

答案 0 :(得分:1)

听起来你的IProgressHandler正在EDT上执行,因此GUI在上传完成之前无法重新绘制。

阅读Concurrency in Swing上的Swing教程中的部分。你可能应该使用SwingWorker来完成这项任务。