У меня есть простой компонент, который имеет некоторые свойства, связанные друг с другом. Например, этот компонент имеет свойство, называемое discountRate, а другое - discountValue. DiscountRate - процент (%) скидки, применяемой к продаже. DiscountValue - это значение ($) скидки, применяемое к продаже. Поскольку пользователь может сообщить либо процент, либо значение, и мне нужно сохранить два значения в базе данных, двунаправленное связывание JavaFX могло бы решить проблему, однако, как вы можете себе представить, эти значения коррелированы, но не совпадают. Я попытался решить эту проблему, создавая привязки в двух сторонах:Двунаправленная привязка с ObjectBinding в 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;
}
}
Как вы можете видеть, я пытаюсь вычислить процент, когда значение выставиться, и вычислить значение, когда скорость выставиться. Связывание, которое я пробовал выше, не может быть связано, так как это войдет в вечный цикл. Есть ли способ сделать привязку для решения этой проблемы, или мне нужно сделать расчет внутри сеттеров?
Я переработан класс для создания пользовательских двунаправленную привязок как вы предположили. Я разместил его здесь: [Индивидуальные двунаправленные привязки в JavaFX] (http://wittcarl.deneb.uberspace.de/wordpress/customized-bidirectional-bindings-in-javafx/) –
@cw «спасибо за блог - это именно то, что Я искал! – kleopatra