0

我目前有一个 JTable,其中填充了一系列数据,这些数据构成了导入屏幕的基础。当我完成选择我想要或不想要的更新后,我按下应用按钮,更新成功应用,但 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();
                        }
                    }
                };

执行此操作没有任何异常,所以我做错了什么?提前致谢。

4

1 回答 1

6

您的片段显示不正确的同步。特别是,您可以从后台线程访问BeanTableModel的子类。AbstractTableModel相反,List<Integer> rowsToRemove在其构造函数中将 传递给您的工作人员。

附录:代替invokeLater(),您可以在 EDT 上执行的TableModel的实现中更新 。process()此外,您不必这样做fireTableDataChanged(),“通知所有侦听器表行中的所有单元格值可能已更改”。removeObject()实现应该触发影响更改所需的最不普遍的事件。

于 2013-01-22T12:24:36.110 回答