После добавления TableRowSorter добавление значений в модель вызывает исключение java.lang.IndexOutOfBoundsException: Invalid range

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

                    }
11
задан kleopatra 17 August 2012 в 15:17
поделиться