После добавления TableRowSorter в таблицу и соответствующую ей модель любые соответствующие добавления, в частности, в firetabletablerowsinserted вызывают исключения. Из тестирования видно, что GetRowCount () возвращает значение за пределами диапазона моделей. Однако мне не имеет смысла, как продолжать добавлять значения в таблицу после добавления сортировщика или фильтра?
В качестве примера я устанавливаю фильтр строк перед добавлением чего-либо в таблицу, затем добавляю значение в таблицу со следующими вызовами в моей модели:
this.addRow(row, createRow(trans,row));
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Количество строк имеет размер 1, и выдается исключение:
java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.checkAgainstModel(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source)
at com.gui.model
Если я делаю те же шаги без предварительного добавления сортировщика, все в порядке. Я предположил, что, возможно, мне нужно было уведомить модель о том, что сортировщик, возможно, внес изменения и попробовал следующее, но все равно возвращает исключение:
this.addRow(row, createRow(trans,row));
this.fireTableStructureChanged()
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Я даже пытался уведомить сортировщик внутри модели о том, что значение было добавлено в модель, прежде чем вызывать fire, как показано ниже, но это также не удается:
this.addRow(row, createRow(trans,row));
if(sorter.getRowFilter() != null){
//if a sorter exists we are in add notify sorter
sorter.rowsInserted(getRowCount(), getRowCount());
}
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
Наконец, я жестко закодировал FireTableRowsInsterted (0,0), и он не выдает никаких исключений. Но ничего не добавляется в таблицу? Итак, я знаю, что это определенно какая-то проблема OutOfBounds.
Я оглянулся и не могу найти ответ. Если у кого-то есть идеи, как это работает, это будет очень полезно.
Вот код, который устанавливает сортировщик внутри jpanel:
messageTable.setRowSorter(null);
HttpTransactionTableModel m = getTransactionTableModel();
final int statusIndex = m.getColIndex("status");
RowFilter<Object,Object> startsWithAFilter = new RowFilter<Object,Object>() {
public boolean include(Entry<? extends Object, ? extends Object> entry) {
for(char responseCode:responseCodes)
{
if (entry.getStringValue(statusIndex).startsWith(Character.toString(responseCode))) {
return true;
}
}
// None of the columns start with "a"; return false so that this
// entry is not shown
return false;
}
};
m.sorter.setRowFilter(startsWithAFilter);
messageTable.setRowSorter(m.sorter);
Вот код внутри моей модели, который добавляет ценность модели:
public void update(Observable o, Object evt) {
if (evt instanceof ObservableEvent<?>) {
ObservableEvent<?> event = (ObservableEvent<?>) evt;
if (event.getElement() instanceof HttpTransaction) {
HttpTransaction trans = (HttpTransaction) event.getElement();
// handle adding of an element
if (event.getAction() == PUT) {
if (includeTransaction(trans)) {
// handle request elements
if (trans.getRequest() != null && idMap.get(trans.getID()) == null) {
idMap.put(trans.getID(), count++);
// transactionManager.save(trans);
int row = idMap.get(trans.getID());
this.addRow(row, createRow(trans,row));
if(sorter.getRowFilter() != null){
sorter.rowsInserted(getRowCount(), getRowCount());
}
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
}