2016-12-07 11 views
3

これらの2つのプロパティをバインドするとどうなりますか?JavaFX:双方向バインディングの初期値

ObjectProperty<Object> propertyA = new SimpleObjectProperty<>(); 
ObjectProperty<Object> propertyB = new SimpleObjectProperty<>(); 

propertyA.set(new ObjectA()); 
propertyB.set(new ObjectB()); 

Bindings.bindBidirectional(propertyA, propertyB); 

両方のプロパティが同じオブジェクト参照を保持するようになっている場合、この結合した後、両方の特性はObjectA又はObjectBの参照を保持しているだろうか?

答えて

4

お問い合わせの際:

Bindings.bindBidirectional(propertyA, propertyB); 

propertyAの値がpropertyBの値に設定されます。

propertyBが既にObjectBを参照するように、この場合には、呼び出しの後、両方のプロパティが参照されます:ObjectB

テストコード

import javafx.beans.binding.Bindings; 
import javafx.beans.property.ObjectProperty; 
import javafx.beans.property.SimpleObjectProperty; 

public class HellBound { 
    public static void main(String[] args) { 
     ObjectProperty<Object> propertyA = new SimpleObjectProperty<>(); 
     ObjectProperty<Object> propertyB = new SimpleObjectProperty<>(); 

     propertyA.set(new ObjectA()); 
     propertyB.set(new ObjectB()); 

     Bindings.bindBidirectional(propertyA, propertyB); 

     System.out.println("propertyA = " + propertyA); 
     System.out.println("propertyB = " + propertyB); 
    } 

    private static class ObjectA { 
    } 

    private static class ObjectB { 
    } 
} 

テスト出力

 
propertyA = ObjectProperty [value: [email protected]] 
propertyB = ObjectProperty [value: [email protected]] 

バインディング実装のソース

注コールproperty1.setValue(property2.getValue());:追加の質問へ

public static <T> BidirectionalBinding bind(Property<T> property1, Property<T> property2) { 
    checkParameters(property1, property2); 
    final BidirectionalBinding binding = 
      ((property1 instanceof DoubleProperty) && (property2 instanceof DoubleProperty)) ? 
        new BidirectionalDoubleBinding((DoubleProperty) property1, (DoubleProperty) property2) 
      : ((property1 instanceof FloatProperty) && (property2 instanceof FloatProperty)) ? 
        new BidirectionalFloatBinding((FloatProperty) property1, (FloatProperty) property2) 
      : ((property1 instanceof IntegerProperty) && (property2 instanceof IntegerProperty)) ? 
        new BidirectionalIntegerBinding((IntegerProperty) property1, (IntegerProperty) property2) 
      : ((property1 instanceof LongProperty) && (property2 instanceof LongProperty)) ? 
        new BidirectionalLongBinding((LongProperty) property1, (LongProperty) property2) 
      : ((property1 instanceof BooleanProperty) && (property2 instanceof BooleanProperty)) ? 
        new BidirectionalBooleanBinding((BooleanProperty) property1, (BooleanProperty) property2) 
      : new TypedGenericBidirectionalBinding<T>(property1, property2); 
    property1.setValue(property2.getValue()); 
    property1.addListener(binding); 
    property2.addListener(binding); 
    return binding; 
} 

回答

javadocは私たちに便利な、この種のを教えてくれない理由私は思ったんだけど情報。

javadocは、人間ではなく神で書かれているためです。時には、人間は、たまらなく脱落します。おそらく神々もそうです:-)

私はそれがJavadocにあるべきであることに同意します。

doc(http://bugreport.java.com)を改善するためのバグレポートを提出できました。または、openjfx-dev開発者リストに投稿すると、改善のためのコミット権限を持つ開発者が得られる可能性があります。自分でパッチを提出することもできますが、ほとんどの人にとっては、すでにOCAに署名しているJDKコミット者でない限り、おそらくそれは価値がありません。

Bindings.bindContentBidirectional()も同じ方法で動作するようにObservableListsで同じにする必要があると仮定していますか?

うん、そのメソッドのソースは、次のコードを持っています

list1.setAll(list2); 
+0

実は、私は右の質問をした後、それを自分自身をテストするためにオフに行き、同じ結論を得ました。 javadocがこの種の有用な情報を私たちに教えてくれないのはなぜかと思っています。また、これは 'ObservableList'sでも同じでなければならないと思います。そのため、' Bindings.bindContentBidirectional() 'も同じように動作するはずです。 – Jai

関連する問題