我目前有一个JTable,其中填充了一系列数据,这些数据构成了导入屏幕的基础。当我选择了我想要或不想要的更新时,我按下Apply按钮,更新成功应用,但JTable没有完全更新。
这是处理应用更改的方法的代码:
private void doProcessChanges() {
ChangeProcessor cp = new ChangeProcessor();
final List<Integer> rowsToRemove = new ArrayList<Integer>();
BeanTableModel<UpdateModel> model = (BeanTableModel<UpdateModel>) table.getModel();
for (int i=0; i<model.getRowCount(); i++) {
UpdateRow ur = mode.getObject(i);
if (ur.isAccepted() <> ChangeAcceptance.NO_ACTION) {
cp.processChange(ur);
rowsToRemove.add(i);
}
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
for (int row : rowsToRemove) {
model.removeObject(row);
model.fireTableDataChanged();
}
}
);
}
从SwingWorker线程中调用该方法,如下所示:
SwingWorker<Object, Object> worker = new SwingWorker<Object, Object>() {
@Override
protected Object doInBackground() throws Exception {
doProcessChanges();
return null;
}
@Override
protected void done() {
try {
get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
};
执行此操作时没有任何异常,所以我做错了什么? 提前谢谢。
答案 0 :(得分:6)
您的片段显示错误的同步。特别是,您从后台线程访问BeanTableModel
的子类AbstractTableModel
。相反,在构造函数中将List<Integer> rowsToRemove
传递给您的worker。
附录:您可以更新invokeLater()
的实施中的TableModel
,而不是process()
,该fireTableDataChanged()
在EDT上执行。此外,您不必removeObject()
,“通知所有侦听器表格行中的所有单元格值可能已更改。” {{1}}实现应触发实现更改所需的最少普遍事件。