JTable не обновляется из потока SwingWorker

В настоящее время у меня есть 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();
                        }
                    }
                };

Я не получаю никаких исключений при выполнении этого, так что я делаю что-то не так? Заранее спасибо.


person Ocracoke    schedule 22.01.2013    source источник
comment
Измените свой вопрос, включив в него sscce, который показывает вашу реализацию publish() и process().   -  person trashgod    schedule 22.01.2013
comment
В настоящее время у меня нет реализации методов publish() или process().   -  person Ocracoke    schedule 22.01.2013
comment
ur.isAccepted() <> ChangeAcceptance.NO_ACTION что означает ‹› ?   -  person vels4j    schedule 22.01.2013
comment
этот вопрос касается отладки с реальными данными, а не как вопрос на форуме, Jide не может быть важным, если вам не хватает данных, см. this нить об удалении строк из модели, хммм, это модели, созданные на лету, связанные с видимым JTable, я бы сомневался ...   -  person mKorbel    schedule 22.01.2013


Ответы (1)


Ваш фрагмент показывает неверную синхронизацию. В частности, вы получаете доступ к BeanTableModel, подклассу AbstractTableModel, из фоновой ветки. Вместо этого передайте List<Integer> rowsToRemove своему воркеру в его конструкторе.

Приложение: Вместо invokeLater() вы можете обновить TableModel в своей реализации process(), которая выполняется в EDT. Кроме того, вам не нужно использовать fireTableDataChanged(), который "уведомляет всех слушателей о том, что все значения ячеек в строках таблицы могли измениться". Реализация removeObject() должна инициировать наименее всеобъемлющее событие, необходимое для осуществления изменения.

person trashgod    schedule 22.01.2013