Hallo,
theoretisch brauche ich die beiden Wörter des Titels nur bei google einzugeben um drölf Trilliarden Lösungsansätze zu bekommen, aber so richtig funktionieren will das alles nicht bei mir.
Es geht sich um folgendes:
Ich habe eine JTable und einige Methoden zur Erkennung von Änderungen überschrieben, wie zB
isCellEditable, editingCanceled, editingStopped, setEditingColumn ..
und das funktioniert im allgemeinen auch alles wie gewünscht.
Beim verlassen einer Zeile wird ein Insert/Update-Statement gebildet und direkt an die Datenbank gesendet.
Problem dabei:
EditingStopped wird NICHT ausgelöst wenn ich meinen Fokus direkt außerhalb des Fensters platziere, oder gar das Fenster in welchem die Tabelle ist, einfach schließe ohne vorher die Zelle gewechselt zu haben.
Folgendes habe ich bereits probiert:
Problem 1: Fehlendes editingStopped beim verschieben des Fokus außerhalb des Fensters.
Wäre mit dem FokusListener auf die Zellen und dann abfragen der oppositeComponent möglich.
Problem 2: Fehlendes editingStopped beim schließen des uebergeordneten Fensters.
Wäre mit einem WindowListener auf das uebergeordnete Fenster möglich.
Nun.. ich finde beide Lösungsansätze ziemlich beschissen, um es ansatzweitzweise glimpflich austzdrücken!!
1. Jeder Zelle einen FokusListener zuweisen. Nehmen wir an, ich erstelle irgendwann einen neuen CellEditor fuer einen besonderen Fall. Wir alle kennen dies, es kommt immer mal wieder vor. Nun muss ich diesem CellEditor in jedem Falle diesen einen FokusListener mitgeben!
Würde ich es tatsächlich ueber diesen Weg machen wollen, dann würde ich mir einen eigenen DefaultCellEditor erstellen, von welchem alle meine CellEditoren erben müssten, jedoch sollte ich damit dies auch durchweg im Code richtig aktzeptiert wird nur jene CellEditoren zulassen.. sprich noch mehr verändern.
2. Entweder ich achte selber sehr genau darauf wo ich solch eine Tabelle einsetze und verändere dementsprechend die WindowListener oder ich müsste mir hierfür auch einen allgemeingültigen WindowListener fuer alle meine Fenster schreiben.
Nun hoffe ich auf eure Hilfe.
Hat jemand von euch selbiges Problem gehabt und/oder habt Verbesserungs/Lösungsansätze für dieses Problemchen?
Liebe Grüße, Danke
theoretisch brauche ich die beiden Wörter des Titels nur bei google einzugeben um drölf Trilliarden Lösungsansätze zu bekommen, aber so richtig funktionieren will das alles nicht bei mir.
Es geht sich um folgendes:
Ich habe eine JTable und einige Methoden zur Erkennung von Änderungen überschrieben, wie zB
isCellEditable, editingCanceled, editingStopped, setEditingColumn ..
und das funktioniert im allgemeinen auch alles wie gewünscht.
Beim verlassen einer Zeile wird ein Insert/Update-Statement gebildet und direkt an die Datenbank gesendet.
Problem dabei:
EditingStopped wird NICHT ausgelöst wenn ich meinen Fokus direkt außerhalb des Fensters platziere, oder gar das Fenster in welchem die Tabelle ist, einfach schließe ohne vorher die Zelle gewechselt zu haben.
Folgendes habe ich bereits probiert:
- table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
=> Ehrlich gesagt konnte ich keinerlei Änderung feststellen. - Jeder Zelle ueber den CellEditor einen FocusListener zuweisen
=> Im Ansatz sah dies garnicht mal so schlecht aus, jedoch wurde das editingStopped dann oftmals doppelt aufgerufen, da ich es bisher noch nicht so recht geschafft habe an dieser Stelle (focusLost) an der Tabelle zu erkennen ob das editingStopped bereits ausgeführt wurde, da bei einem FokusWechsel in das nächste Feld bereits setEditingColumn noch vor dem focusLost auf die letzte Zelle ausgeloest wird.
Der Aufruf sah bei einem Zell-Wechsel wie folgt aus:
EditingStopped < Speichern
SetEditingColumn < Edit = TRUE (neue Zelle)
FocusLost
Im FocusLost war ein Abfragen auf meine Boolsche "Edit"Variable dann auch
Geschichte. Wenn ich es nämlich dann nochmal Aufrufe, dann wird das ganze fuer die "Aktuelle" Zelle durchgeführt und meine Maus selektiert nurnoch die aktuelle Zelle, ist aber nicht mehr im EdititierModus.
Doch auch dafuer gab es Abhilfe, denn die Idee es ueber eine eigene Boolsche Variable abzufragen war nicht korrekt. Stattdessen habe ich mir vom FocusEvent die OppositeComponent zurueckgeben lassen. Sobald diese "null" zurückliefert, konnte ich einen FocusLost außerhalb des Fensters beobachten und somit bei "null" ein editingStopped ausfuehren. - Dem uebergeordneten Fenster einen WindowAdapter mitgegeben:
Ein WindowAdapter der beim schließen nach jener Tabelle sucht, und insofern eine vorhanden ist wird hier ebenfalls ein editingStopped ausgefuehrt an jenem Objekt welches im Window gefunden wurde.
Problem 1: Fehlendes editingStopped beim verschieben des Fokus außerhalb des Fensters.
Wäre mit dem FokusListener auf die Zellen und dann abfragen der oppositeComponent möglich.
Problem 2: Fehlendes editingStopped beim schließen des uebergeordneten Fensters.
Wäre mit einem WindowListener auf das uebergeordnete Fenster möglich.
Nun.. ich finde beide Lösungsansätze ziemlich beschissen, um es ansatzweitzweise glimpflich austzdrücken!!
1. Jeder Zelle einen FokusListener zuweisen. Nehmen wir an, ich erstelle irgendwann einen neuen CellEditor fuer einen besonderen Fall. Wir alle kennen dies, es kommt immer mal wieder vor. Nun muss ich diesem CellEditor in jedem Falle diesen einen FokusListener mitgeben!
Würde ich es tatsächlich ueber diesen Weg machen wollen, dann würde ich mir einen eigenen DefaultCellEditor erstellen, von welchem alle meine CellEditoren erben müssten, jedoch sollte ich damit dies auch durchweg im Code richtig aktzeptiert wird nur jene CellEditoren zulassen.. sprich noch mehr verändern.
2. Entweder ich achte selber sehr genau darauf wo ich solch eine Tabelle einsetze und verändere dementsprechend die WindowListener oder ich müsste mir hierfür auch einen allgemeingültigen WindowListener fuer alle meine Fenster schreiben.
Nun hoffe ich auf eure Hilfe.
Hat jemand von euch selbiges Problem gehabt und/oder habt Verbesserungs/Lösungsansätze für dieses Problemchen?
Liebe Grüße, Danke