java - JTable 单元格未通过定期更新进行更新

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

        }
    };

请建议我实现这一目标。

最佳答案

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

阅读 Swing 教程中关于 Concurrency in Swing 的部分。您可能应该使用 SwingWorker 来完成此任务。

关于java - JTable 单元格未通过定期更新进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15618659/

相关文章:

java - Web 服务器生成格式错误的 services.wsdl

java - JAXB 在编码 java 时将 xmlns 添加到元素中

java - 为 Windows 更改 JButton 的禁用前景(字体)颜色

java - 更新 JLabel 的文本而不改变其他所有内容

java - 如何在 Java 中选择标题时选择 JTable 列

java - Spring-返回对象列表的请求方法显示错误

java - 使用 spring 和 Hibernate 的基本 CRUD 应用程序

java - 我应该在 SwingWorker.doInBackground() 中使用 SwingUtilities.invokeLater() 吗?

java - 如何向 JTextField 添加动态变量?

java - 单击时 JTable 恢复为旧单元格