如何将Java中Map的size与ObjectProperty<Integer>绑定?
解决方案
要实现Map的size与ObjectProperty<Integer>的自动绑定,核心问题是普通HashMap没有变更通知机制,无法让属性感知到size变化。可以通过以下两步解决:
1. 使用支持监听的ObservableMap
将普通HashMap替换为JavaFX提供的ObservableMap,它会在元素增删时发出变更通知,可通过FXCollections.observableHashMap()创建实例。
2. 利用Bindings.size()实现绑定
Bindings.size()方法接收ObservableMap后,会返回一个IntegerBinding(实现了ObservableValue<Integer>接口),可以直接和ObjectProperty<Integer>绑定,实现size变化时的自动同步。
修改后的完整代码:
import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableMap; import javafx.beans.binding.Bindings; public class ContainerOJ { protected final ObjectProperty<Integer> objCount; protected ObservableMap<String, String> stackMap; public ContainerOJ() { this.objCount = new SimpleObjectProperty<>(0); this.stackMap = FXCollections.observableHashMap(); // 绑定Map的size到objCount objCount.bind(Bindings.size(stackMap)); } public void addToStack(String newObj) { if (stackMap.get(newObj) != null) { /* Obj:{}, already exists in the Stack:{} */ return; } stackMap.put(newObj, newObj); // 无需手动set,绑定会自动更新objCount } public Integer getObjCount() { return objCount.get(); } public ObjectProperty<Integer> objCountProperty() { return objCount; } }
额外说明
如果无法替换为ObservableMap,也可以手动在所有修改Map的方法(比如新增、删除元素的方法)里调用objCount.set(stackMap.size()),但这种方式容易遗漏修改场景,可靠性不如ObservableMap的自动绑定。
内容的提问来源于stack exchange,提问作者4673_j
相关产品推荐
相关产品推荐

