Hi, mir fliegen hier grad NullPointer-Exceptions um die Ohren, genau genommen eine einzige. Abgesehen davon hab ich noch ein weiteres Problem, was zwar keine Exception wirft, aber trotzdem in meinen Augen fehlerhaft ist.
Also ich hab ne Methode updateTable, die aufgerufen wird nachdem die Daten im Model verändert wurden (ich mach das von außen, also nicht durch die Editier-Funktion des Tables).
Die schaut so aus:
Das funzt soweit auch. allRowsChanged() muss ich aufrufen damit neu sortiert wird, denn es kann ja sein dass durch die Änderung die aktuell angewählte Zeile neu einsortiert werden muss.
Jetzt hab ich mir noch einen Filter geschrieben. Durch nen Toggle button kann man den ein- und ausschalten. Beim Einschalten wird ein RowFilter erzeugt, und gesetzt:
Beim deaktivieren wird einfach null übergeben. Das funktioniert soweit auch noch alles.
Beim Einschalten filtert er mir also alles raus, was nicht mit meinem Suchbegriff matcht. Aber hier tritt die erste Merkwürdigkeit auf: Wenn ich einen Eintrag dann anklicke, wird er zwar ausgewählt (der ListSelectionListener reagiert, und der Index stimmt), aber irgendwie wird die Zeile nicht markiert. D.h. der Renderer springt wohl nicht an?!
Okay aber das ist jetzt gar nicht mein Hauptproblem. Mein Hauptproblem ist: Wenn ich den Filter wieder deaktiviere (was dazu führt dass wieder alle Einträge sichtbar sind), und ich klicke dann auf einen Eintrag, kommt ne Null-Pointer-Exception:
das allRowsChanged() ist das Problem. Nimm ich es raus, kommt kein Fehler. Aber ich brauch das ja, wie ich weiter oben erläutert hab. Ich versteh das nicht, wieso NPE bei restoreSelection()? Was hat das mit allRowsChanged() zu tun.
... falls das irgendwie alles unklar ist, bitte fordert weiteren Code ein. Hat jemand eine Idee, was hier abgeht?
Also ich hab ne Methode updateTable, die aufgerufen wird nachdem die Daten im Model verändert wurden (ich mach das von außen, also nicht durch die Editier-Funktion des Tables).
Die schaut so aus:
Java:
protected void updateTable() {
/*
* We just re-validate the affected row, and then update the sorter,
* which is less expensive than firing a complete data change
* notification to the table. Besides, we won't lose the selection, so
* we don't have to re-set the selection.
*/
Database model = (Database) table.getModel();
int modelIndex = model.getCopy().indexOf(movie);
model.fireTableRowsUpdated(modelIndex, modelIndex);
table.getRowSorter().allRowsChanged();
/*
* the entry might have gotten out of the view area, so we snap the
* scroll bar to make it visible
*/
int viewIndex = table.convertRowIndexToView(modelIndex);
Rectangle cellRect = table.getCellRect(viewIndex, 0, false);
table.scrollRectToVisible(cellRect);
}
Das funzt soweit auch. allRowsChanged() muss ich aufrufen damit neu sortiert wird, denn es kann ja sein dass durch die Änderung die aktuell angewählte Zeile neu einsortiert werden muss.
Jetzt hab ich mir noch einen Filter geschrieben. Durch nen Toggle button kann man den ein- und ausschalten. Beim Einschalten wird ein RowFilter erzeugt, und gesetzt:
Java:
sorter.setRowFilter(myFilter); // sorter = table.getRowSorter...
Beim Einschalten filtert er mir also alles raus, was nicht mit meinem Suchbegriff matcht. Aber hier tritt die erste Merkwürdigkeit auf: Wenn ich einen Eintrag dann anklicke, wird er zwar ausgewählt (der ListSelectionListener reagiert, und der Index stimmt), aber irgendwie wird die Zeile nicht markiert. D.h. der Renderer springt wohl nicht an?!
Okay aber das ist jetzt gar nicht mein Hauptproblem. Mein Hauptproblem ist: Wenn ich den Filter wieder deaktiviere (was dazu führt dass wieder alle Einträge sichtbar sind), und ich klicke dann auf einen Eintrag, kommt ne Null-Pointer-Exception:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.JTable$SortManager.restoreSelection(Unknown Source)
at javax.swing.JTable$SortManager.processChange(Unknown Source)
at javax.swing.JTable.sortedTableChanged(Unknown Source)
at javax.swing.JTable.sorterChanged(Unknown Source)
at javax.swing.RowSorter.fireRowSorterChanged(Unknown Source)
at javax.swing.RowSorter.fireRowSorterChanged(Unknown Source)
at javax.swing.DefaultRowSorter.sort(Unknown Source)
at javax.swing.DefaultRowSorter.allRowsChanged(Unknown Source)
at gui.details.DetailsPanel.updateTable(DetailsPanel.java:96)
das allRowsChanged() ist das Problem. Nimm ich es raus, kommt kein Fehler. Aber ich brauch das ja, wie ich weiter oben erläutert hab. Ich versteh das nicht, wieso NPE bei restoreSelection()? Was hat das mit allRowsChanged() zu tun.
... falls das irgendwie alles unklar ist, bitte fordert weiteren Code ein. Hat jemand eine Idee, was hier abgeht?