hashmap - JavaFX:使用 HashMap 绑定(bind)向 TableView 添加行

标签 hashmap javafx tableview

假设我有一个 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/

相关文章:

java - Java 如何对 HashMap 或 HashTable 中的项目进行排序?

c++ - C++ 中的 Hashmap 不对元素进行排序?

java - jcombobox 用 hashmap 填充

java - 为什么 java hashmap 在计数为 8 时对 bin 进行树形化,而在计数为 6 时对 bin 进行树形化?

intellij-idea - 如何在 IntelliJ 项目中将 ScenicView 作为 Java 代理启动?

java - 如何在 JavaFX 8 上禁用按钮事件直到 http 响应

JavaFX eclipse 配置 - openJDK 10

ios - 从 plist 加载数据到 UITableView 时模拟器崩溃

ios - 每次导航返回时如何管理单元格颜色样式

java - javafx中是否有SimpleLOngProperty,如果没有那么该怎么办?