假设我有一个 map 集合:
ObserableHashMap<K,V> map = FXCollections.observableHashMap();
我在 fxml Controller 初始化期间将 1 条记录放入此映射中,然后将其包装为 ObservableList
:
ObservableList<ObserableHashMap.Entry<K,V>> list = FXCollections.observableArrayList(map.entrySet());
然后 setitems
为我的 tableView.setItems(list);
当我运行这个 JavaFX 应用程序并显示 1 条记录时,一切正常。
问题是:
当我稍后向 map 添加更多记录时,我的 TableView
将不会刷新这些记录。
如何将动态 map 集合绑定(bind)到我的 TableView
中?
谢谢
最佳答案
如果您使用 ObservableMaps 的 ObservableList 作为 TableView 的数据结构
ObservableList<ObservableMap> rowMaps = FXCollections.observableArrayList();
tableView.setItems(rowMaps);
并实现您自己的 ObservableMapValueFactory
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.MapChangeListener;
import javafx.collections.ObservableMap;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.util.Callback;
public class ObservableMapValueFactory<V> implements
Callback<TableColumn.CellDataFeatures<ObservableMap, V>, ObservableValue<V>> {
private final Object key;
public ObservableMapValueFactory(Object key) {
this.key = key;
}
@Override
public ObservableValue<V> call(CellDataFeatures<ObservableMap, V> features) {
final ObservableMap map = features.getValue();
final ObjectProperty<V> property = new SimpleObjectProperty<V>((V) map.get(key));
map.addListener(new MapChangeListener<Object, V>() {
public void onChanged(Change<?, ? extends V> change) {
if (key.equals(change.getKey())) {
property.set((V) map.get(key));
}
}
});
return property;
}
}
然后将其设置为列的单元格值工厂
column.setCellValueFactory(new ObservableMapValueFactory<String>(columnId));
对数据的所有更改都会反射(reflect)在 TableView 中,即使更改仅影响 ObservableMap。
关于hashmap - JavaFX:使用 HashMap 绑定(bind)向 TableView 添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21713096/