Заполните JTable большим количеством строк

Я хотел бы заполнить JTable во время выполнения множеством строк (скажем, 10000). Но все мои попытки очень бедны и неэффективны.

Отправной точкой являетсяaddData метод, который получает список объектов, представляющих строку. Я пытался заполнить таблицу через SwingWorker, но это работает только для небольших данных для меня.

Другой попыткой была установка данных напрямую без использования какого-либо потока, но это также очень медленно, по крайней мере, пользовательский интерфейс не блокируется, как в случае с SwingWorker.

Так как ты делаешь это вообще? Таблица должна быть заполнена построчно или по частям, но не все по одному, а вертикальная полоса прокрутки должна быть прокручиваемой.

Моя TableModel:

public class MyTableModel extends AbstractTableModel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    String[] columnNames;   
    public Map<Long, ErrorMessage> data = new LinkedHashMap<Long, ErrorMessage>(); 

    public MyTableModel(String[] header) {
        columnNames = header;
    }

    public String getColumnName(int col) {
        return columnNames[col].toString();
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public int getRowCount() {
        return data.size();
    }


    @Override
    public Object getValueAt(int row, int col) {
            .
            .
        return value;
    }

    public void addRow(long id, MyDataObject o) {
            data.put(id, m);
            fireTableRowsInserted(0,nqm_messages.size()-1);         
    }

}

Реализация SwingWorker:

class TableSwingWorker extends SwingWorker<MyTableModel, MyDataObject> {

    private final MyTableModel tableModel;
    List<MyDataObject> messages;

    public TableSwingWorker(MyTableModel tableModel, List<MyDataObject> dataList) {
        this.tableModel = tableModel;
            this.messages = new LinkedList<MyDataObject>(mm);
    }

    @Override
    protected MyTableModel doInBackground() throws Exception {

        for(MyDataObject s : messages) {
            publish(s);
        }

        return tableModel;
    }

    @Override
    protected void process(List<MyDataObject> chunks) {
        for(MyDataObject row : chunks){
            Long l = Long.parseLong(row.getId());
            tableModel.addRow(l, row);
        }
    }
}

Добавить объекты в JTable:

public void addData(List<MyDataObject> o) {

    MyTableModel m = (MyTableModel)table.getModel();

    (new TableSwingWorker(m,o)).execute();

    //for(int i=0; i < mm.size();i++) {
    //    long l = Long.parseLong(mm.get(i).getId());
    //    m.addRow(l, mm.get(i));
    //}
}

Ответы на вопрос(1)

Ваш ответ на вопрос