我有两个属性:
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/