JavaFX Löschen im Tabelview macht Problem

Diskutiere Löschen im Tabelview macht Problem im AWT, Swing, JavaFX & SWT Bereich.
J

Joob

Ich habe ein Tableview mit einem Buttom.

Die Daten sind in einer Observable List gespeichert. In Beans.

Wenn ich nun auf Löschen klicke wird der Datensatz geprüft ob er gesperrt ist und ggf. gelöscht.
Danach wird das Tableview neu angezeigt und zwar ohne den gelöschten Datensatz.

Wenn ich nun aber direkt nacheinander zwei Datensätze anklicke,
zb. zwei die direkt untereinander liegen.

Dann wird der erste korrekt gelöscht,
offensichtlich merkt sich javafx aber den zweiten Klick und führt ihn danach aus.
Da aber das Tableview bis dahin bereits aktualisiert ist, wird nun ein Datensatz unter den beiden gelöscht.

Das ist nachvollziehbar aber nicht korrekt.
Wie kann ich das zweite und weiter Klickevents löschen bis die erste Löschaktion beendet ist.

Das Problem ist das das Tabelview ja nichts davon weiß was im Beans abläuft.
Ich habe aber Zugriff auf den Controller in dem das Tabelview deklariert ist.

ggf. wäre es eine Lösung nach der ersten Löschaktion im Beans erst einmal dort alle noch ausstehenden Klicks im Controller des Tableviews zu löschen.
Ich weiß aber nicht wie.
 
J

Joob

Hab ich das zu kompliziert formuliert.
Wenn ja kann ich es neu versuchen .
 
J

Joob

Ich versuche es noch mal.

Offensichtlich merkt sich das TableView welche Position in der Observallist angeklickt wurde und arbeitet diese nach und nach ab.
Wenn man löscht muss man aber dem Benutzer die geänderte Anzeige zeigen.
Also baut man die Observal neu auf.

Das interessiert aber das TableView nicht und er nimmt nun die gemerkte Position. zb. 9
Diese ist falsch weil um eins verschoben. (in der Position befindet sich nun ein anderes Bean, welches nun gelöscht wird.)

Was ich gerne tun würde, ist das:
Herausfinden ob noch gemerkte Positionen vorliegen und erst dann die Liste aktualisieren wenn keine mehr vorliegen.

Ich weiß nur nicht wie ich das herausfinden kann.
Bitte um Hilfe.
 
J

Joob

Nein .
Ich hatte das schon in Erwägung gezogen aber es erschien mir nicht wirklich hilfreich. (Abfrage task running ..)

Ich zeige dir mal das Fenster und die Konsolenausgabe.
Also das Problem ist wenn ich zweimal schnell auf die Mülleimer von zwei Vokablen klicke.

Grundsätzlich läuft das bei einem Mal. Aber ich muss dann ja auch das geänderte Ergebnis anzeigen.
Das geht nur wenn ich die ObservalList aktualisiere und dann kommt es zu dem Problem.

1591994110879.png

So und jetzt mal die Konsolenausgabe:
id to del bean : 8697- BL : Arme
Delete : 8697
No File deleted.
No File deleted.
filtv
id to del bean : 9165- BL : Aufruf
Delete : 9165
No File deleted.
No File deleted.
filtv

Ich hatte "Arme" und "auch" angeklickt.
Man kann dann sehen er löscht Arme,
aktualisiert die Ansicht
und löscht dann Aufruf, welches ja nach der Aktualisierung die Position von auch in der ObservalList eingenommen hat.

Mir fiel dazu nur ein, das ich herausfinden müsste ob das Tabelview dahingehend noch etwas in der Liste hat
und die Aktualisierung nur dann auszuführen wenn diese leer ist.

Ist das verständlich dargestellt ?
 
J

Joob

PS:
das ganze passiert absolut syncron und so gemächlich das man zuschauen kann.
 
mihe7

mihe7

Also das Problem ist wenn ich zweimal schnell auf die Mülleimer von zwei Vokablen klicke.
OK, das ergibt Sinn. Du klickst an zwei verschiedene Positionen, nach dem ersten Klick ist das Programm beschäftigt, aktualisiert die Tabelle und dann wird der Klick für die zweite Position verarbeitet. Da sich die Daten zwischenzeitlich geändert haben, steht an dieser Position natürlich ein anderer Satz. Das Problem verschäft sich, je länger die Arbeit dauert, die von einem Klick ausgelöst wird.

Andersrum: wenn Du mehrfach in die gleiche Zeile klickst, dann dürften die Sätze nacheinander gelöscht werden.

Finde ich persönlich jetzt nicht störend. Aber generell würde es sich empfehlen, die Arbeit in einen Thread auszulagern. Sollte das immer noch nicht reichen, dürftest Du halt in einem bestimmten Zeitraum nur einen Klick zulassen. Das hat für mich aber eher was von einem Hack.

Villeicht hat @dzim eine Idee...
 
L

LimDul

So aus dem Bauch heraus - anstelle mit einem ClickListener eventuell mit einem Button arbeiten, der in der Zeile angezeigt wird? Der Button sollte das zu löschende Element kennen und dann geht es evtl.
 
J

Joob

OK, das ergibt Sinn. Du klickst an zwei verschiedene Positionen, nach dem ersten Klick ist das Programm beschäftigt, aktualisiert die Tabelle und dann wird der Klick für die zweite Position verarbeitet. Da sich die Daten zwischenzeitlich geändert haben, steht an dieser Position natürlich ein anderer Satz. Das Problem verschäft sich, je länger die Arbeit dauert, die von einem Klick ausgelöst wird.

Andersrum: wenn Du mehrfach in die gleiche Zeile klickst, dann dürften die Sätze nacheinander gelöscht werden.

Finde ich persönlich jetzt nicht störend. Aber generell würde es sich empfehlen, die Arbeit in einen Thread auszulagern. Sollte das immer noch nicht reichen, dürftest Du halt in einem bestimmten Zeitraum nur einen Klick zulassen. Das hat für mich aber eher was von einem Hack.

Villeicht hat @dzim eine Idee...
Das mit dem Thread würde keinen Unterschied machen, denn der wird erst ausgelöst wenn der syncrone Teil fertig ist.
Ich habe auch schon hin und her überlegt.

Aber egal wie man es wendet, eine wirklich sichere Methode wäre es diese Liste im Tabelview nach der die Klicks abgearbeitet werden zu löschen.
Ich habe auch schon ganz grobe Sachen probiert, indem ich das Tableview vor Verarbeitung gesperrt habe.
Aber darauf reagiert es nicht.
Der springende Punkt ist es das der Button im Bean definiert ist. Das Tabelview aber die Position der ObservalList vermerkt, würde das Tabelview einen Verweis auf das Beanobjekt vermerken wäre das Problem nicht da.
 
J

Joob

Zum Thread,
schau mal wie das abgearbeitet wird, in der Konsolenausgabe. Der Thread würde zwar asyncron laufen, aber erst später gestartet so das das keinen Unterschied machen würde.
 
mihe7

mihe7

Bei einem Klick ermittelst Du das zu löschende Objekt, startest einen Thread und kehrst sofort zurück. Dann kann der zweite Klick sofort verarbeitet werden, so dass das richtige Objekt ermittelt werden kann.
 
dzim

dzim

Sorry, bin erst jetzt wieder dazu gekommen zu lesen. So ganz bin ich auch nicht durchgestiegen, was eigentlich hier so lange dauert. Muss wohl erst noch lesen/verstehen, worum es überhaupt geht... 🤣

Aber etwas Asynchron zu tun, macht für mich absolut Sinn! Ich würde halt in der Zeit, bis die ominöse Aktion fertig ist, irgendwie verhindern, dass der User Unsinn machen kann. Entweder ein Overlay mit einem Spinner über die Tabelle legen, oder diese auf disabled schalten, oder alle Löschen-Buttons disablen.

Mich würde auch interessieren, was hier synchron passiert, denn häufig ist es ja nicht gut, wenn man etwas länger dauerndes auf dem UI-Thread macht. Denn im schlimmsten Fall wirkt die Applikation dadurch träge und produziert die berüchtigtes "diese Anwendung reagiert nicht"-Meldung.

Aber ich sehe ja, du hast einen kreativen Weg drum herum gebaut. Nun ja. Dann war es wohl doch etwas sinnlos, dass ich überhaupt schreibe... 🤷‍♂️
 
J

Joob

Trotzdem schönen Dank.
Ich war halt ziemlich frustriert.
Momentan muss ich mich um was anderes kümmern, aber ich denke das schau ich mir später noch mal an.

Schönen Dank.
 
Thema: 

Löschen im Tabelview macht Problem

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben