在 JavaFX 中使用 ObjectBinding 进行双向绑定
2022-09-03 15:33:24
我有一个简单的豆子,它有一些相互关联的属性。例如,此 Bean 具有一个称为 discountRate 的属性和另一个称为 discountValue 的属性。折扣率是应用于销售的折扣百分比 (%)。折扣值是应用于销售的折扣值 ($)。由于用户可以通知百分比或值,并且我需要将这两个值存储在数据库中,因此JavaFX双向绑定可以解决问题,但是,您可以想象,这些值是相关的,但不相同。我尝试解决这个问题,在两端创建绑定:
public class ExampleBean{
private ObjectProperty<BigDecimal> discountValue;
private ObjectProperty<BigDecimal> discountRate;
public BigDecimal getDiscountvalue() {
return discountValueProperty().getValue();
}
public void setDiscountValue(BigDecimal discountvalue) {
this.discountValueProperty().set(discountvalue);
}
public ObjectProperty<BigDecimal> discountValueProperty() {
if(discountValue==null){
discountValue=new SimpleObjectProperty<BigDecimal>(new BigDecimal("0.00"));
discountRate=new SimpleObjectProperty<BigDecimal>(new BigDecimal("0.00"));
configureDiscountBinding();
}
return discountValue;
}
private void configureDiscountBinding(){
discountValue.bind(Bindings.createObjectBinding(new Callable<BigDecimal>() {
@Override
public BigDecimal call() throws Exception {
return getDiscountRate().multiply(getTotalValue()).divide(new BigDecimal("100"));
}
}, discountRateProperty()));
discountRate.bind(Bindings.createObjectBinding(new Callable<BigDecimal>() {
@Override
public BigDecimal call() throws Exception {
return getDiscountValue().multiply(new BigDecimal("100")).divide(getTotalValue());
}
}, discountValueProperty()));
}
public BigDecimal getDiscountRate() {
return discountRateProperty().getValue();
}
public void setDiscountRate(BigDecimal discountRate) {
this.discountRateProperty().set(discountRate);
}
public ObjectProperty<BigDecimal> discountRateProperty() {
if(discountRate==null){
discountRate=new SimpleObjectProperty<BigDecimal>(new BigDecimal("0.00"));
discountValue=new SimpleObjectProperty<BigDecimal>(new BigDecimal("0.00"));
configureDiscountBinding();
}
return discountRate;
}
}
如您所见,我正在尝试在设置值时计算百分比,并在设置比率时计算值。我上面尝试的绑定无法绑定,因为这将进入一个永恒的循环。有没有办法做一个绑定来解决这个问题,或者我需要在setters内部进行计算?