Заполните 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));
//}
}