您将需要侦听对字段的更改,但是要跟踪是否触发了侦听器,以免在无休止的循环中再次触发。灵感来自JavaFX的实际代码,在此进行了反编译。
private void configureDiscountBinding() { discountValue.addListener(new ChangeListener<BigDecimal>() { private boolean changing; @Override public void changed(Observablevalue<? extends BigDecimal> observable, BigDecimal oldValue, BigDecimal newValue) { if( !changing ) { try { changing = true; discountRate.set(newValue.multiply(new BigDecimal("100")).divide(getTotalValue(), RoundingMode.HALF_DOWN)); } finally { changing = false; } } } }); discountRate.addListener(new ChangeListener<BigDecimal>() { private boolean changing; @Override public void changed(Observablevalue<? extends BigDecimal> observable, BigDecimal oldValue, BigDecimal newValue) { if( !changing ) { try { changing = true; discountValue.set(newValue.multiply(getTotalValue()).divide(new BigDecimal("100"), RoundingMode.HALF_DOWN)); } finally { changing = false; } } } });}
这既简单又麻烦;如果您广泛使用此功能,则可以将inner重构
ChangeListener为某种常见类型或其他一些聪明的解决方案。
我用以下主要代码测试了上面的代码(您将不得不提供一个
BigDecimalgetTotalValue()方法,就我而言,我只是返回了一个常量
BigDecimal):
public static void main(String[] args) { ExampleBean e = new ExampleBean(); System.out.println("Setting rate to 50%"); e.discountRateProperty().set(new BigDecimal(50.0)); System.out.println("-> value=" + e.getDiscountvalue()); System.out.println("Setting value to 25"); e.discountValueProperty().set(new BigDecimal(25.0)); System.out.println("-> rate=" + e.getDiscountRate() + "%");}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)