我正在尝试实现一个涉及两个字段计算的GUI。我的模型有2个属性和一个绑定。
ObjectProperty<BigDecimal> price = new SimpleObjectProperty<>();
ObjectProperty<BigDecimal> quantity= new SimpleObjectProperty<>();
ObjectBinding<BigDecimal> totalPrice = new ObjectBinding<BigDecimal>() {
{ bind(price,quantity);}
protected BigDecimal computeValue() {
if (price.get() == null || quantity.get() == null) return null;
return price.get().multiply(quantity.get());
}
};
我的GUI有3个TextField
,分别对应价格、数量和总价。通常情况下,我会将我的属性和TextField
之间进行常规绑定,如下所示:
priceTextField.textProperty().bindBidirectional(myModel.priceProperty(), new NumberStringConverter());
现在有点棘手的是,如果用户修改了价格或数量,它必须更新总价(这是绑定目前所做的)。但我希望能够做到以下几点:如果用户更新了总价,则按固定价格重新计算相应的数量。
所以问题是:我如何创建这样的流程 => 总价绑定在价格和数量上,但数量绑定在总价和价格上。当我在totalPriceTextfield
中输入内容时,它应该更新quantityTextField
,反之亦然。
谢谢。
****** 编辑 ********
这里有一段丑陋的代码,只是为了说明我想要实现的功能(注意:我知道我可以使用Binding.multiply
等方法,但我需要为将来的项目实现计算函数)。
public class TestOnBindings {
private DoubleProperty price = new SimpleDoubleProperty(10.0);
private DoubleProperty quantity = new SimpleDoubleProperty(1.0);
private DoubleProperty total = new SimpleDoubleProperty(1.0);
private DoubleBinding totalBinding = new DoubleBinding() {
{bind(quantity,price);}
@Override
protected double computeValue() {
return quantity.get()*price.get();
}
};
private DoubleBinding quantityBinding = new DoubleBinding() {
{bind(total,price);}
@Override
protected double computeValue() {
return total.get()/price.get();
}
};
public TestOnBindings(){
total.bind(totalBinding); //should really not do that, looks ugly
quantity.bind(quantityBinding); //now you're asking for troubles
}
public void setPrice(Double price){
this.price.set(price);
}
public void setQuantity(Double quantity){
this.quantity.set(quantity);
}
public void setTotal(Double total){
this.total.set(total);
}
public Double getTotal(){
return total.get();
}
public Double getQuantity(){
return quantity.get();
}
public static void main(String[] args) {
TestOnBindings test = new TestOnBindings();
test.setQuantity(5.0);
System.out.println("Total amount = " + test.getTotal());
}
}
还有一个明显的错误:
异常线程中出现了 "main" java.lang.RuntimeException: 无法设置绑定值。 在 javafx.beans.property.DoublePropertyBase.set(DoublePropertyBase.java:142)。
total.removeListener(...);
,然后重新添加即可。 - brianslider1.valueProperty().addListener((obs,nv,ov)->{slider2.setValue(nv.doubleValue());}); slider2.valueProperty().addListener((obs,nv,ov)->{slider1.setValue(nv.doubleValue());});
- cw'