Я хотел бы заполнить JTable во время выполнения множеством строк (скажем, 10000). Но все мои попытки очень плохи и неэффективны.Заполнение JTable с большим количеством строк
Отправной точкой является метод 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));
//}
}
Лучший способ, ИМХО, не делать этого. Никто не может ничего сделать с этим количеством строк. Добавьте форму поиска. Добавить разбивку на страницы. –
Проблема с вашим 'SwingWorker' заключается в том, что он забивает. Это означает, что он никогда не получает время «публиковать» результаты до тех пор, пока (или близко к концу) основного цикла. Приходят две вещи. 1- Добавьте небольшую задержку в основной цикл (5-10 миллисекунд), который позволит «SwingWorker» и возможность обрабатывать все опубликованные результаты. 2. Добавьте пакетную таблицу добавления к вам, которая позволит вам добавить несколько строк в один вызов метода – MadProgrammer
И почему вы запускаете событие, указывающее, что все строки были вставлены в ваш метод 'addRow'? – Robin