JavaFx - 将 MapProperty 键集绑定(bind)到 SetProperty

标签 java javafx

我有两个属性:

SetProperty<String> set

MapProperty<String, Map<String, String>> map

我的问题是如何绑定(bind)此 map 属性的键集来设置属性?

最佳答案

您可以自己创建一个 SetBinding 类来监听 ObservableMap 中的更改:

public class MapKeyBinding<K> extends SetBinding<K> {

    private final ObservableSet<K> readonlyView;

    public <V> MapKeyBinding(ObservableMap<K, V> map) {
        ObservableSet<K> set = FXCollections.observableSet();
        set.addAll(map.keySet());
        readonlyView = FXCollections.unmodifiableObservableSet(set);
        map.addListener((MapChangeListener.Change<? extends K, ? extends V> change) -> {
            if (change.wasAdded() != change.wasRemoved()) {
                if (change.wasRemoved()) {
                    set.remove(change.getKey());
                } else {
                    set.add(change.getKey());
                }
            }
        });
    }

    @Override
    protected ObservableSet<K> computeValue() {
        return readonlyView;
    }

}

使用

ReadOnlySetProperty<String> set = new ReadOnlySetWrapper(new MapKeyBinding(map)).getReadOnlyProperty();

请注意,这里使用 SetProperty 并不是真正必要的,因为您可以使用 ObservableSet:

ObservableSet<String> set = new MapKeyBinding(map);

但是,如果您坚持每次修改 Map 时都替换 ObservableSet,则可以使用绑定(bind) API:

 set.bind(Bindings.createObjectBinding(() -> new MapKeyBinding<>(map.get()), map));

关于JavaFx - 将 MapProperty 键集绑定(bind)到 SetProperty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36338148/

相关文章:

java - 显示三张卡片图像 - JavaFX

java - 仅将textfield的提示文字居中

java - 在启动时启动方法

java - 在对象数组列表中搜索具有特定字段值的对象

java - 无法使用 StoredProcedureItemReader 读取 REF_CURSOR

java - JDBC 无法解析为类型

java - 保持服务器和客户端之间的通信畅通 - Java

java - Android:使用 KML 文件和地理位置检测国家/地区

Apple Silicon/UnsatisfiedLinkError : Can't load library: libprism_es2. dylib 上的 JavaFx

JavaFx BorderPane 区域大小操作