Swing JTable: Fehler beim Nutzen von RowSorter#setRowFilter

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
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:

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 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:

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?
 
S

Spacerat

Gast
Der fehler scheint eindeutig in [c]allRowsChanged()[/c] zu liegen.
Mal sehen, ob ich das richtig verstanden habe...
1. Beim deaktiviertem Filter fliegt diese Exception
2. Bei aktiviertem Filter werden die Einträge zwar angezeigt, können aber nicht selektiert werden.

Ich vermute mal, dass für Ausgabe und Sortierung ungewollt zwei verschiedene Listen verwendet werden, bzw. entstehen.
Die NPE bekommst du wohl, weil in einer unsynchonisierten Methode, der Filter plötzlich Null werden kann, selbst dann, wenn vorher gegen Null geprüft wurde.
Naja, das ist jetzt alles rein hypothetisch... Die Methoden für Ausgabe und [c]allRowsChanged()[/c] wären für mich mal interessant.
 

hdi

Top Contributor
Beim deaktiviertem Filter fliegt diese Exception
Nur, wenn man ihn vorher aktiviert hatte, und nach dem Abschalten wieder einen Eintrag anklickt

Bei aktiviertem Filter werden die Einträge zwar angezeigt, können aber nicht selektiert werden.
Selektiert werden können sie schon, wie gesagt der SelectionListener reagiert und das Event liefert auch den richtigen Index. Aber ich hab nen CellRenderer der bei isSelected() den Hintergrund der Zeile färbt. Das passiert beim erstmaligen Anklicken eines Eintrags nach dem Aktivieren des filters nicht...Da kommt auch kein Fehler oder so, aber die Zeile färbt sich nicht ein, so, als wäre sie nicht selected.

Die Methoden für Ausgabe und allRowsChanged() wären für mich mal interessant.
allRowsChanged() ist nicht meine Methode, schon klar oder? Hört sich so an als denkst du das wäre eine eigene. Das ist aber eine Standardmethode der API.
Und was meinst du mit Ausgabe?

Danke für die Hilfe!
 
S

Spacerat

Gast
Äh... [c]allRowsChanged()[/c] ist 'ne abstrakte Methode in [c]RowSorter[/c]. Nun kenne ich die tieferen Analen von Swing nicht weit, um zu Wissen, was man mit der Klasse überhaupt machen kann, wie z.B. eigene Sortiermethoden basteln um Filter darauf anzuwenden. Eines istmir jedoch Klar: Zwischen [c]allRowsChanged()[/c] und [c]myFilter[/c] besteht ein dichter Zusammenhang. Ich komm nicht umhin, anzunehmen, dass die Methode vor dem Rendern eine Methode in deinem Filter aufruft bzw. dein Filter vorher schon etwas mit dem SelectionModel des Tables gemacht (bzw. nicht gemacht) hat, z.B. beim entfernen "null" gesetzt. Hab' da mal den verdächtigen Abschitt der Fehlermeldung rausgefischt:[JAVA=4016]// Aus JTable$SortManager
private void restoreSelection(ModelChange change) {
syncingSelection = true;
if (lastModelSelection != null) {
restoreSortingSelection(lastModelSelection,
modelLeadIndex, change);
lastModelSelection = null;
} else if (modelSelection != null) {
ListSelectionModel viewSelection = getSelectionModel();
viewSelection.setValueIsAdjusting(true);
viewSelection.clearSelection();
int min = modelSelection.getMinSelectionIndex();
int max = modelSelection.getMaxSelectionIndex();
int viewIndex;
for (int modelIndex = min; modelIndex <= max; modelIndex++) {
if (modelSelection.isSelectedIndex(modelIndex)) {
viewIndex = convertRowIndexToView(modelIndex);
if (viewIndex != -1) {
viewSelection.addSelectionInterval(viewIndex,
viewIndex);
}
}
}
// Restore the lead
int viewLeadIndex = modelSelection.getLeadSelectionIndex();
if (viewLeadIndex != -1) {
viewLeadIndex = convertRowIndexToView(viewLeadIndex);
}
SwingUtilities2.setLeadAnchorWithoutSelection(
viewSelection, viewLeadIndex, viewLeadIndex);
viewSelection.setValueIsAdjusting(false);
}
syncingSelection = false;
}[/code]Ich nehme mal an, das Zeile 4025 die Exception wirft, weil das Entfernen des Filters auch das SelectionModel ungültig gemacht hat. Aber wie gesagt... Bin nicht wirklich fit in Swing...
Naja... Mit der Ausgabe habe ich wohl den CellRenderer gemeint.
 

hdi

Top Contributor
Keine Ahnung wie du jetzt auf Zeile 4025 gekommen bist, aber du hast Recht! Ich hatte in meinen ListSelectionListenern keine Überprüfung auf e.getValueIsAdjusting. Eig. auch so geplant, da ich es cooler fand wenn man mit gezogener Maustaste durch die Table gehen kann und sich die Anzeige updatet...

Aber das bringt einige Fehler mit sich und ist mit Vorsicht zu genießen wie es aussieht. Ich reagiere jetzt nur wenn es nicht adjusting ist. Damit
- hab ich, soweit ich bisher sehen konnte, alle Probleme mit dem Filter gelöst
- mein Performance-Problem gelöst (siehe anderer Thread).

Dafür, dass du dich mit Swing ja sowas von nicht auskennst, war Zeile 4025 ja ganz gut geraten... :autsch:

Merci !!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Fehler Inhalt von JTable wird gelöscht AWT, Swing, JavaFX & SWT 5
E Swing Fehler nach Befüllen einer JTable mit gesetzem Rowsort?! AWT, Swing, JavaFX & SWT 10
P Swing Misteriöser Fehler JTable AWT, Swing, JavaFX & SWT 5
P finde den Fehler im JTable nicht AWT, Swing, JavaFX & SWT 2
D Fehler bei JTable AWT, Swing, JavaFX & SWT 8
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
thet1983 Swing MySQL >> JTable AWT, Swing, JavaFX & SWT 5
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
O JTable linksbündig drucken (nicht der Zelleninhalt) AWT, Swing, JavaFX & SWT 2
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
O JTable ohne Rahmen printen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben