以下情况:
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
}
};
答案 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 ;
}
});