拦截属性绑定

时间:2017-10-19 12:39:10

标签: java javafx javafx-8

以下情况:

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

p1.bind(p2);

是否有可能以某种方式修改这种直接的方法来拦截值设置过程以修改设定值?

2 个答案:

答案 0 :(得分:0)

如果SimpleDoubleProperty不是最终的,您可以按如下方式覆盖bind()函数并创建一个匿名子类:

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

答案 1 :(得分:0)

如果您只想对值执行简单的算术运算,可以使用绑定API,它支持一组非常丰富的算术函数:

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

将确保p1始终等于p2*p2+1(就像任意示例一样),并且

p1.bind(Bindings
    .when(p2.lessThan(0))
    .then(0)
    .otherwise(p2));
p1为非负数时,

将确保p2始终等于p2,否则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 ;
    }
});