首页 > 解决方案 > 如何绑定 ObjectBinding到带有格式化程序的标签?

问题描述

我有一个ObservableList<Items> items并且可以计算项目价格(BigDecimal)的总和,并通过以下方式将结果绑定到标签文本属性:

 totalSumLabel.textProperty().bind(
                Bindings.createObjectBinding(() -> items.stream()
                                .map(item -> item.getPrice())
                                .reduce(BigDecimal.ZERO, BigDecimal::add),
                        items)
                .asString("%.2f €"));

但现在我想使用格式化程序(DecimalFormat)而不是asString("%.2f €")更灵活的方法,我不知道如何实现这一点。如果有人可以展示如何使用格式化程序实现绑定(尽可能不使用侦听器),那就太好了。谢谢你。

标签: javafxbindingformatter

解决方案


在 Slaw 的评论的帮助下,我能够找出以下可行的解决方案:

ObjectBinding<BigDecimal> totalSumObjectBinding = Bindings.createObjectBinding(() ->
                                items.stream()
                                        .map(item -> item.getPrice())
                                        .reduce(BigDecimal.ZERO, BigDecimal::add),
                        items);

DecimalFormat formatter = (DecimalFormat) NumberFormat.getCurrencyInstance(Locale.getDefault());

StringBinding totalSumStringBinding = Bindings.createStringBinding(() ->
            formatter.format(totalSumObjectBinding.getValue()), totalSumObjectBinding);

totalSumLabel.textProperty().bind(totalSumStringBinding);

如果有更雄辩的方法,请告诉我。


推荐阅读