После добавления 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());
}