Swing Speicher-Hinweis bei Formularänderungen

C

Camino

Gast
Hallo,

ich bräuchte mal ein bisschen Anschubhilfe. Und zwar hab ich in meiner Anwendung ein Formularpanel mit relativ vielen Elementen (hauptsächlich Textfelder, aber auch Checkboxen, Comboboxen, Togglebutton). Nun möchte ich erfahren, wenn eine Änderung irgendwo im Formular gemacht wurde, damit ich den User auf das Speichern des Datensatzes hinweisen kann, wenn er das Formular verlassen möchte. Am besten soll auch schon direkt bei einer getätigten Änderung angezeigt werden (z.B. Sternchen im Tab, Speicher-Button aktiviert), dass der Datensatz geändert wurde und gespeichert werden muss. So ähnlich wie bei Textverarbeitungsprogrammen oder Editoren. Wie würdet ihr so etwas realisieren? Gibt es da schon gute Ideen und Vorschläge? Muss ich für jedes Element einen Listener setzen, der bei Änderung ein Flag setzt? Oder gibt es bessere Lösungen?

Viele Grüsse
Camino
 
C

Camino

Gast
Sorry, dass ich jetzt erst antworte. Hab mir mal mehr über den PropertyChangeListener angeschaut. Bin zwar noch nicht richtig schlauer geworden, werde das aber mal ausprobieren und schauen, ob es klappt. Ansonsten melde ich mich einfach nochmal...

Vielen Dank
Camino
 
C

Camino

Gast
Hallo,

ich muss diesen Thread nochmal hervorkramen, da ich jetzt konkret an dem Problem arbeite...

Ich versteh das mit dem PropertyChangeListener nicht so richtig. Ich hab ja ein Formular mit Personen-Daten, die durch ein Objekt der Klasse Person dargestellt werden. Nun hab ich eine Klasse FormChangeListener (abgeleitet von PropertyChangeListener) erstellt und dies einem JTextField im Formular hinzugefügt.
Java:
tfStrasse.addPropertyChangeListener(new FormChangeListener())

Soweit ich das nun sehe, wird die Methode propertyChange mit dem PropertyEvent aufgerufen, wenn das Formular angezeigt wird.

Wie kann ich nun mit diesem LIstener feststellen, ob und wann sich an dem Wert in dem JTextField etwas geändert hat?

Ich möchte dies dann für das ganze Formular umsetzen, also erkennen, ob jemand Werte geändert hat, und dann anzeigen, dass die Person abgespeichert werden muss.

Viele Grüsse
Camino
 

truesoul

Top Contributor
Ich denke das ist das was du suchst :)
Java:
textfeld.getDocument().addDocumentListener(...);

P.S Jede Änderung wird beachtet. Allein wenn man schon ein Buchstaben/Zahl hinzufügt oder entfernt.
Mfg
 
Zuletzt bearbeitet:
C

Camino

Gast
Ich denke das ist das was du suchst :)
Java:
textfeld.getDocument().addDocumentListener(...);

P.S Jede Änderung wird beachtet. Allein wenn man schon ein Buchstaben/Zahl hinzufügt oder entfernt.
Mfg
Das heisst, ich hänge an alle meine Textfelder einen DocumentListener, der dann feststellt, ob sich was an dem Wert im Textfeld geändert hat, dann mach ich irgendwo einen farbigen Hinweis oder aktiviere den Speicher-Button, setze eine Flag und weise dann beim Versuch des Schliessens ohne Speichern darauf hin.

Wie schon geschrieben, hab ich nicht nur Textfelder in diesem Formular, sondern auch andere Komponenten wie Checkboxen, Togglebuttons, Comboboxen... Da funktioniert der DocumentListener doch nicht, oder? Ah OK, hab gerade gesehen, dass es dafür auch ItemListener gibt.

Und der PropertyChangeListener ist definitiv nicht das Richtige, was ich brauche?
 
Zuletzt bearbeitet von einem Moderator:

truesoul

Top Contributor
Hi.

PropertyChangeListener wird z.B bei JTextfelder nur ausgelöst wenn z.B der Name
Java:
textfeld.setName(..);
geändert wird aber nicht bei einer Eingabe oder mit
Java:
textfeld.setText(..);
.
Eine genaure Beschreibung findest du aber in der Java Api oder über google :)

Und nach deinem vorherigen Post passt in meinen Augen der DocumentListener.
 

Ariol

Top Contributor
Wäre es nicht einfacher die zuletzt gespeicherten Daten im Speicher zu lassen und beim Verlassen der Anwendung auf Änderungen zu prüfen?

Das hätte 2 Vorteile und einen Nachteil:
  • bessere Performance, da nicht bei jeder Änderung geprüft wird
  • keine Abfrage, wenn alle Änderungen wieder rückgängig gemacht wurden.
  • Die Daten müssen "doppelt" im Speicher gehalten werden.
 
C

Camino

Gast
Danke euch beiden für die Tipps...

Hi.

PropertyChangeListener wird z.B bei JTextfelder nur ausgelöst wenn z.B der Name
Java:
textfeld.setName(..);
geändert wird aber nicht bei einer Eingabe oder mit
Java:
textfeld.setText(..);
.
Eine genaure Beschreibung findest du aber in der Java Api oder über google :)

Und nach deinem vorherigen Post passt in meinen Augen der DocumentListener.
Das heisst, der PropertyChangeListener bezieht sich auf Änderungen an den Eigenschaften des Textfelds selbst und nicht auf den Wert, der dort drinsteht? OK, dann ist der DocumentListener vielleicht wirklich das, was ich suche.


Wäre es nicht einfacher die zuletzt gespeicherten Daten im Speicher zu lassen und beim Verlassen der Anwendung auf Änderungen zu prüfen?

Das hätte 2 Vorteile und einen Nachteil:
  • bessere Performance, da nicht bei jeder Änderung geprüft wird
  • keine Abfrage, wenn alle Änderungen wieder rückgängig gemacht wurden.
  • Die Daten müssen "doppelt" im Speicher gehalten werden.
Na ja, ich hab eigentlich in meiner Anwendung ein JTabbedPane, in dem mehrere Tabs mit jeweils einem Formular mit Personendaten geöffnet werden können. Ich hatte mir das auch schon überlegt, beim Öffnen eines Tabs das Person-Objekt zu "merken" und beim Schliessen des Tabs die aktuellen Daten mit dem ursprünglichen Objekt zu vergleichen und bei Ungleichheit zum Speichern aufzufordern.

Auch das mit dem "Änderungen wieder rückgängig machen" würde ja dafür sprechen.

Aber ich dachte mir, es wäre nicht schlecht, wenn schon während einer Änderung der Daten eine visuelle Erinnerung erscheint (farblich im Tab-Reiter, Speicher-Button enablen...), damit der Benutzer gleich sieht, dass gespeichert werden muss.

Ich müsste halt bei der ersten Änderungen von Daten im Formular ein Flag setzen und den visuellen Speicherhinweis sichtbar machen. Ich hab keine Ahnung, ob das mit der Performance so extrem ist, wenn bei jedem Datenelement im Formular ein Listener auf Änderungen horcht. Da dachte ich mir, es wäre evtl. möglich, bei der ersten Änderung das Flag zu setzen, die visuellen Hinweise sichtbar zu machen und dann die Listener an den überwachten Komponenten wieder zu deaktivieren. Wenn dann der Speichern-Button geklickt wurde, wird das wieder zurückgesetzt, also Listener wieder hinzufügen, Flag auf false, Speicher-Button setEnabled(false)...

Hab aber keine Ahnung, wie das richtig oder am Besten bewerkstelligt werden sollte. Ich dachte mir halt auch, dass da schon andere vor ähnlichem Problem gestanden, gegrübelt und eine Lösung gefunden haben.
 

Ariol

Top Contributor
Noch als Idee:

Lass das originale Personenobjekt im Speicher und prüfe sowohl über PropertyChange als auch beim Verlassen deine Änderungen gegen dieses Original.

So kannst du in Echtzeit anzeigen welche Felder sich geändert haben (bzw. welche wieder so wie zu Beginn sind) und eine entsprechende Meldung am Ende anzeigen wenn es nötig sein sollte.

Außerdem hättest du noch die Möglichkeit die Daten einzeln wieder auf den Ausgangszustand zu resetten.
 
C

Camino

Gast
Noch als Idee:

Lass das originale Personenobjekt im Speicher und prüfe sowohl über PropertyChange als auch beim Verlassen deine Änderungen gegen dieses Original.
Ich dachte nicht PropertyChange sondern DocumentListener wäre hier eher angebracht...

Aber wenn ich das mit dem Resetten einbauen möchte, komme ich ja nicht drum herum, das ursprüngliche Personenobjekt (bzw. seit dem letzten Speichern) im Speicher zu behalten. Ist halt auch die Frage, wie das mit der Performance ist, wenn ständig Listener horchen. Oder ob es Sinn macht, die Listener nach der ersten Änderung zu deaktivieren.
 

Ariol

Top Contributor
Mach's doch erstmal mit Listenern. Es sollte nicht schlimm sein, wenn du in der listener-Methode nicht den Bau abreisst.
Wenn's zu langsam ist, kannst du die Sachen in der Methode eh noch in einen SwingWorker auslagern (eh eine gute idee).
 
C

Camino

Gast
So, das mit den Listenern klappt jetzt. Für Textfelder den DocumentListener und für Checkboxen und ToggleButtons einen ItemListener. Sobald eine Änderung an einer Komponente auftritt, werden Speicher-Button und Reset-Button eingeblendet. Das Person-Objekt seit der letzten Speicherung kann dann wieder zurückgesetzt werden. Ich hab jetzt allen Komponenten den Listener hinzugefügt und keine grossen Verzögerungen in der Anwendung festgestellt. Dürfte also nicht problematisch sein, die Listener die ganze Zeit dort horchen zu lassen.

Jetzt muss ich nur noch eine Verbindung zu den Tabreitern herstellen. Dort hab ich ja den Namen und ein rotes Kreuz zum Schliessen des Tabs. Zum Namen soll ein Sternchen hinzugefügt werden, wenn eine Änderung erfolgt ist und beim Versuch, den Tab zu schliessen soll geschaut werden, ob etwas verändert wurde und dann eine Abfrage (Speichern oder Abbrechen) kommen.

Ausserdem muss ich das auch noch überwachen, wenn die Anwendung komplett geschlossen wird.
 

Ähnliche Java Themen

Neue Themen


Oben