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コンストラクターでワーカーにを渡します。

補遺:の代わりに、EDTで実行されるの実装でをinvokeLater()更新できます。また、 「テーブルの行のすべてのセル値が変更された可能性があることをすべてのリスナーに通知する」必要はありません。実装は、変更を実行するために必要な最も普及していないイベントを発生させる必要があります。TableModelprocess()fireTableDataChanged()removeObject()

于 2013-01-22T12:24:36.110 に答える