После добавления 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());
Я даже пытался уведомить сортировщик внутри модели о том, что в модель было добавлено значение перед вызовом огня, как показано ниже, но это также не удалось:
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());
}
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());
-- меньше на единицу, это индекс с отсчетом от нуля - person Whired   schedule 04.06.2012