Nach dem hinzufügen eines TableRowSorter hinzufügen von Werten zu Modell zu java.lang.IndexOutOfBoundsException: Ungültiger Bereich

Nach dem hinzufügen eines TableRowSorter zu einer Tabelle und das entsprechende Modell eine entsprechende ergänzt, die speziell auf firetabletablerowsinserted dazu führen, Ausnahmen. Es ist klar aus der Prüfung, dass die GetRowCount() ist die Rückgabe ein Wert der Vergangenheit die Modelle reichen. Allerdings macht es keinen Sinn für mich, wie es weiter das hinzufügen von Werten zur Tabelle nach einem Sortierer oder filter Hinzugefügt wurde?

Als Beispiel, habe ich die Zeile filter, bevor Sie etwas hinzufügen, um die Tabelle, dann fügen Sie einen Wert, um die Tabelle mit den folgenden aufrufen in meinem Modell:

this.addRow(row, createRow(trans,row));
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());

Den rowcount ist von der Größe 1, und die exception wird geworfen:

java.lang.IndexOutOfBoundsException: Invalid range
at javax.swing.DefaultRowSorter.checkAgainstModel(Unknown Source)
at javax.swing.DefaultRowSorter.rowsInserted(Unknown Source)
at com.gui.model

Wenn ich die gleichen Schritte ohne ersten hinzufügen der sorter alles in Ordnung ist. Ich nahm an, dass vielleicht, die ich brauchte, um Benachrichtigen Sie das Modell, dass der sorter kann änderungen vorgenommen haben, und versucht, die folgenden aber immer noch gibt eine Ausnahme:

this.addRow(row, createRow(trans,row));
this.fireTableStructureChanged()
this.fireTableRowsInserted(this.getRowCount(), this.getRowCount());

Ich sogar versucht, Benachrichtigen Sie den sorter in das Modell, dass ein Wert Hinzugefügt wurde, um das Modell vor dem Aufruf von Feuer wie unten, aber es funktioniert nicht so gut:

 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());

Schließlich habe ich hart codiert die FireTableRowsInsterted(0,0) und es löst keine Ausnahme. Aber nichts wird Hinzugefügt, um die Tabelle? Also, ich weiß, es ist definitiv irgendeine Art von OutOfBounds Problem.
Ich habe überall gesucht und kann nicht scheinen, um die Antwort zu finden. Hat jemand eine Idee, wie dies angenommen, es arbeiten sehr hilfreich sein.
Hier ist code, setzt den sorter im inneren 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);

Hier ist der code, der in meinem Modell, die Mehrwert für Modell:

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()); -- off von einem, es ist null-basierten index
  • +1 @Whired - gute spotting 🙂
InformationsquelleAutor steve | 2011-05-28
Schreibe einen Kommentar