JavaBeanPropertyAdapter

Tom Eugelink tbee at tbee.org
Sat Dec 17 01:42:44 PST 2011


>> Bindings for Java Bean properties will be slightly different than our usual bindings: they will be eager and they may become out-of-sync. Let's say we have a Java Bean Property p, that is bound to an ObservableValue v. Internally we hook a listener to v and propagate all changes to p by calling its setter (that is why it will be eager). If now p does not accept the value from v, p and v will be out-of-sync. Especially the last point bothers my, but I guess there is no way to ensure synchronization.
> Right, we're just sort of hosed there.

How about the if-set-then-sync-back approach? Which basically means that every time after calling the setter, you'll do an equals on the result and if it it is not equal a sync-back is started.

sync A->B:
     try
     {
         A.setter(value)
     }
     finally
     {
         if (A.getter.equals( value ) == false) // TODO: also take nulls in comparison
         {
             sync B->A
         }
     }

If this starts to loop then something is wrong in the user's code, because it has attempted to reach a state that should (can) not exist. N.B. this approach is different from the current binding logic of JavaFX, where the JavaFX side always accepts the value (if I remember correctly Richard?)




>
> Very few Java classes use VetoableChangeListeners. However, I think that is OK since the common usage here will be to either do a unidirectional binding from a JavaFX property to a POJO (for example, Label.text is bound to Customer.name), or a bidirectional binding between the two. So this seems fine.

The approach above also takes care of this scenario, via the finally construct.

Tom



More information about the openjfx-dev mailing list