JavaFX中的ObjectBinding进行双向绑定

JavaFX中的ObjectBinding进行双向绑定,第1张

JavaFX中的ObjectBinding进行双向绑定

您将需要侦听对字段的更改,但是要跟踪是否触发侦听器,以免在无休止的循环中再次触发。灵感来自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() + "%");}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5429332.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存