2017-10-19 169 views
0

以下情況:攔截屬性綁定

DoubleProperty p1 = new SimpleDoubleProperty(1.0); 
DoubleProperty p2 = new SimpleDoubleProperty(5.5); 

p1.bind(p2); 

是它在某種程度上可以修改這個直接的方式攔截值設定處理,以便修改設定值?

+0

修改它怎麼樣?如果需要,可以使用各種方法創建自定義綁定,但我不確定這是否是您要查找的內容。 –

回答

0

如果SimpleDoubleProperty不是最終可以覆蓋bind()功能如下,並創建一個匿名子類:

DoubleProperty p1 = new SimpleDoubleProperty(1.0){ 
    @Override 
    public void bind(DoubleProperty property){ 
     // do your interception-magic here 
    } 
}; 
0

如果你只是想在值進行簡單的算術,你可以使用綁定API,它支持相當豐富的算術函數:

p1.bind(p2.multiply(p2).add(1)); 

將確保p1總是等於p2*p2+1(就像一個任意的例子),和

​​

將確保p1總是等於p2p2是非負的,並且p1是零,否則。

如果這不足以滿足您的需求,您可以使用自定義綁定,例如:

p1.bind(Bindings.createDoubleBinding(() -> { 
    double p2Value = p2.getValue(); 
    double interceptedValue = ... ; 
    return interceptedValue ; 
}, p2); 

最後一個參數是一個Observable可變參數,所以你可以列出的任何屬性(或其他觀測)那裏你想觸發綁定的失效。

的等效方式是繼承DoubleBinding

p1.bind(new DoubleBinding() { 
    { 
     bind(p2); // and to other properties if needed... 
    } 

    @Override 
    protected double computeValue() { 
     double p2Value = p2.getValue(); 
     double interceptedValue = ... ; 
     return interceptedValue ; 
    } 
}); 
+0

感謝您的回答,我想這會做我需要的。但是:我試圖在控制器的'@FXML public void initialize(){..}'方法中做到這一點,我得到了「綁定值無法設置」的異常 - 可能是由佈局引擎本身。 – Hannes

+0

@Hannes這聽起來獨立於此。無法將綁定值直接綁定到其他屬性或綁定到更復雜的綁定。你想綁定什麼? –

+0

將TextField的layoutXProperty分配給ComboBox的相應屬性 – Hannes