Ich habe mich gefragt, wie man Werte bindet, bei denen die Quelle der Bindung null sein kann.
Ich habe eine Eigenschaft:
%Vor%Ich habe auch ein Textfeld:
%Vor% Ich möchte das textProperty
des Feldes an den Wert des Operationsobjekts binden.
Mein erster Gedanke war, FluentAPI mit seinem when / then / sonst-Konstrukt zu verwenden, aber es wird eifrig ausgewertet, also die Lösung:
%Vor% wirft einen NPE, weil der Parameter otherwise
unabhängig vom Ergebnis von when
ausgewertet wird.
Meine nächste Idee war irgendwie, Lambda zu benutzen:
%Vor%Aber die Bindung hat keine Lambda-fähige Lösung. (Später erkannte ich, dass dies nicht möglich war, da die eigentliche Arbeit rückwärts geht: Die Änderung des gebundenen Objekts (Operation) löst die Aktualisierung des Binders aus (die Feldtexteigenschaft).)
Einige Artikel haben vorgeschlagen, einen "extremal" -Wert für die Eigenschaft anstelle von null zu verwenden. Aber die Operation ist eine komplexe und schwergewichtige Komponente, so dass es nicht trivial ist, eine künstliche Instanz zu konstruieren, die null darstellt. Mehr noch, das scheint mir der Kesselcode zu sein, etwas, das der Bindungsmechanismus zur Beseitigung beitragen soll.
Mein nächster Versuch bestand darin, die Bindungsrichtung logisch zu vertauschen und einen Listener zur operation-Eigenschaft hinzuzufügen und das Feld programmatisch zu aktualisieren. Es funktioniert und ziemlich einfach, solange die Notwendigkeit der Aktualisierung nur die Operationsobjektinstanzen abfragt:
%Vor%Es ist relativ einfach, aber funktioniert nicht: es wirft "Ein gebundener Wert kann nicht festgelegt werden." Ausnahme und ich sehe nicht, warum die Texteigenschaft der Kontrolle als gebunden betrachtet wird.
Ich hatte keine Ideen mehr. Nach vielen Suchen kann ich das einfache Problem nicht lösen, ein Textfeld anders zu aktualisieren, abhängig davon, ob die Quelle null ist oder nicht.
Das scheint so einfach und alltäglich zu sein, dass ich sicher bin, dass ich die Lösung verpasst habe.
Wenn eine Bibliothek von Drittanbietern verfügbar ist, besuchen Sie EasyBind . Versuchen Sie etwas wie folgt:
%Vor% Es gibt auch ein JavaFX JIRA-Problem für den von EasyBind bereitgestellten Funktionalitätstyp. Wenn Sie keine Bibliothek von Drittanbietern verwenden möchten, versuchen Sie Bindings.select
:
Beachten Sie, dass die Nullprüfung in Bindings.select
nicht sehr effizient ist. Es gibt ein JIRA-Problem dafür .
Nur für den Fall, dass jemand nicht Java selbst benutzt, sondern Kotlin.
Es ist eine gute Idee, eine wunderbare tornadofx Bibliothek zu verwenden.
Dort kannst du einfach operation.select{it.name}
verwenden. Obwohl dieses Feature noch nicht dokumentiert ist, dauerte es einige Zeit, es zu entdecken.
Tags und Links data-binding javafx properties