You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:52:05