Montag, 3. Juni 2013

Binding

Das Problem beim Binding ist in der Regel, dass man nur Properties binden kann. Wohingegen Strings, Integer, oder andere Datentypen nicht direkt an die gewünschten Elemente gekoppelt werden können. Die eigentlich benötigten Datentypen können aber glücklicherweise an Properties gesetzt werden.

Wie funktioniert das Ganz also:

Egal ob man dabei mit Tabellen arbeitet, oder mit anderen Nodes aus JavaFX - die Vorgehensweise ist immer dieselbe.
Zuerst wird ein Property-Objekt benötigt. Je nachdem, was genau gebunden werden soll, kann man schon hier zswichen gewissen Datentypen unterscheiden.
Zum Beispiel:

  • SimpleStringProperty
  • SimpleIntegerProperty
  • SimpleBooleanProperty
  • SimpleObjectProperty
  • ...
Diese Klassen SimpleObjectProperty ist die mächtigste dieser Propertyklassen, was nicht heißt, dass es sich dabei um eine Oberklasse handelt. Sollte man mit einem Datentyp arbeiten, den keine Propertyklasse speziell verarbeiten kann, schafft SimpleObjectProperty immer Abhilfe für die Bindung.
Nun zur Implementation - das Property-Objekt wird instantiiert und der Wert dessen auf die entsprechende Referenz gesetzt. Im Beispiel handelt es sich um einen einfachen String:

public StringProperty labelString = new SimpleStringProperty("hallo");

Der Wert der StringProperty entspricht nun dem String "hallo". Dieses Property-Objekt kann nun an eine beliebige Node gehängt werden (Binding). Hierzu ein Beispiel mit einem TextField:

TextField tf =  new TextField();
  tf.textProperty().bind(labelString);

Es gibt viele andere Properties der Nodes, wie z.B. alignmentProperty() oder visibleProperty(). Es ist möglich an alle dieser Properties bestimmte Objekte, oder Inhalt von Objekten zu binden.

Was bringt das Ganze nun?
Es macht die Implementation etwas schöner, da beim Verändern des Inhaltes einer Node, diese nicht mehr direkt verändert werden muss. Die geschieht über das Property-Objekt, welches an die Node gebunden wurde. Vereinfacht gesagt, wurde an die Node eine Art Listener angehängt, der die Änderung bestimmter Inhalte überwacht. Zum Ändern der Node, muss also nur noch die Property geändert werden, welche man in einer separaten Klasse implementieren könnte. Das sorgt für eine klarere Struktur.

Die Änderung der Property erfolgt über die Methode "set()":

labelString.set("wie geht's?");

Die Verwendung von anderen Datentypen in den Properties wird z.B. in folgendem Beitrag gezeigt:
Nodes in Tabellen