我正在使用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);
}
};
请建议我实现这一目标。
答案 0 :(得分:1)
听起来你的IProgressHandler正在EDT上执行,因此GUI在上传完成之前无法重新绘制。
阅读Concurrency in Swing上的Swing教程中的部分。你可能应该使用SwingWorker来完成这项任务。