TableView gibt keine Werte für das Ereignis focus lost aus

8

Ich möchte eine Tabelle mit den folgenden Features erstellen:

  • Bearbeiten bei Tastendruck
  • Eingabetaste = nächste Zeile
  • Tab-Taste = nächste Spalte
  • Escape-Taste = Bearbeitung abbrechen

Unten ist ein Code, der diese Funktionen implementiert. Die Werte sollten bei verlorenem Fokus festgeschrieben werden. Problem: Sie sind nicht verpflichtet. Das Fokusänderungsereignis wird ausgelöst, die Werte würden entsprechend der Konsolenausgabe korrekt sein, aber am Ende sind die Werte in den Tabellenzellen die alten.

Weiß jemand, wie man das verhindert und wie erhält man das aktuelle EditingCell-Objekt, damit ich das Commit manuell aufrufen kann? Schließlich sollte eine Art von Verifier aufgerufen werden, die verhindert, dass der Fokus geändert wird, wenn die Werte nicht korrekt sind.

%Vor%

Vielen Dank!

Bearbeiten: Ich habe es eingegrenzt. Es scheint das Problem zu sein, dass der JavaFX-Code den Bearbeitungsmodus aufhebt, wenn sich der Fokus ändert. Das ist schlecht.

%Vor%     
Roland 11.04.2015, 10:04
quelle

4 Antworten

11

Ich bin neugierig geworden und habe Hintergrundrecherchen gemacht.

Sie stehen vor dem Problem eines bekannten Bugs in JavaFX.

Hintergrund

Wenn Sie commitEdit(textField.getText()) aufrufen, prüft es zuerst den Wert von isEditing() und gibt zurück, wenn der Wert false ist, ohne zu committen.

%Vor%

Warum gibt es false zurück?

Wie Sie wahrscheinlich herausgefunden haben, wird TAB oder ENTER gedrückt, um Ihre Auswahl zu ändern. cancelEdit() wird aufgerufen, wodurch TableCell.isEditing() auf false gesetzt wird. Zu dem Zeitpunkt, zu dem der Fokuseigenschaftslistener commitEdit() in textField aufgerufen wird, gibt isEditing() bereits false zurück.

Lösungen / Hacks

Es gab Diskussionen über das Thema in der JavaFX-Community. Die Leute dort haben hacks gepostet, auf die Sie gerne zugreifen können.

Es gibt einen Hack in einem SO-Thread , der die Aufgabe erfüllt, obwohl ich es nicht getan habe versuchte es (noch).

    
ItachiUchiha 11.04.2015, 12:00
quelle
1

Mein Vorschlag zur Lösung dieser Grausamkeit ist der folgende (Entschuldigung für fehlende JavaDoc).

Dies ist eine Cancel-to-Commit-Umleitungslösung. Ich habe es unter LINUX mit Java 1.8.0-121 getestet. Die einzige Möglichkeit, einen Zelleneditor zu verwerfen, besteht darin, ESCAPE zu drücken.

%Vor%

Sie können diese Klasse erweitern, um jeden Datentyp zu unterstützen.

Beispiel für ein String-Feld ist ( Person ist eine Beispiel-Bean):

%Vor%

Um auf diese Weise angewendet zu werden:

%Vor%     
user2006754 20.03.2017 22:06
quelle
1

Ich bin auf das gleiche Problem gestoßen und habe es gelöst, indem ich diese beiden Codefragmente kombiniert habe:

Benutzerdefinierte TableCell-Implementierung

%Vor%

Controller

%Vor%     
lazlev 09.11.2017 15:04
quelle
0

Ich hatte eine einfache Lösung gefunden, die in meinem Fall für TableCells funktioniert. Die Idee ist, commitEdit bei Fokus verloren zu vergessen. Lassen Sie javafx arbeiten und aktualisieren Sie dann den Wert der zuvor bearbeiteten Zelle.

%Vor%

Der einzige Trick besteht darin, setItemValue () so zu implementieren, dass der korrekte Teil des Elements aktualisiert wird.

    
Serge 16.02.2018 13:46
quelle

Tags und Links