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 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie eine aus, indem Sie 1 Fehler. Der richtige code zum abfeuern der Fall ist:
Ging ich zurück und hatte einen besseren Blick auf diese, nachdem er kleopatra Kommentar. Ich veränderte mein TableModel nach dem erstellen eines RowSorter, aber vor dem anbringen der RowSorter an die JTable. Hier ist ein Beispiel, das zeigt das problem, das ich hatte.
modelStructureChanged()
Linie, es funktioniert. Aber wir vereinbarten, (Nein, die javadocs konkret sagen), dass es falsch ist zu nennen, dass die Methode selbst. Also, was ist das mitnehmen hier??RowSorter
zu der Tabelle Hinzugefügt wird, bevor dieaddRow
- Methode aufgerufen, und ich bekomme immer noch den Fehler. Also ich glaube nicht, dass das einen Unterschied macht.RowSorter
bevor Sie das Modell funktioniert für mich. Ich denke, das ist der beste Ansatz, wenn möglich. In meinem Beispiel, bewegentable.setRowSorter(rowSorter)
obenmodel.add("First added item.")
. Die JavaDocs sagenYou normally do not call this method
. Ich glaube nicht, dass das bedeutet, dass es verboten ist, nur nicht gewöhnlich. Diese Frage ist ziemlich alt, und ich habe nie akzeptiert, eine Antwort, denn keiner von Ihnen erklären, die Lösung extrem gut. Sie können starten Sie eine neue Frage durch den code, der verursacht Probleme für Sie.So, jetzt sieht es aus, wenn Sie überprüfen in Ihrem Modell, wenn der aktuell in der Sortier-Modus und wenn das ist Fall nur aufrufen, aktualisieren Sie auf das Sortieren-Modell. Ansonsten normal nennen Modell fire-updates scheint alles soweit zu funktionieren. Ich bin immer noch offen für bessere Möglichkeiten, dies zu behandeln obwohl: