JavaFX:使用HashMap绑定将行添加到TableView [英] JavaFX: Adding rows to TableView with a HashMap binding

查看:805
本文介绍了JavaFX:使用HashMap绑定将行添加到TableView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个地图集合:

  ObserableHashMap< K,V> map = FXCollections.observableHashMap(); 

在fxml控制器初始化过程中,我将1条记录放入此映射中,然后将其作为 ObservableList

  ObservableList< ObserableHashMap.Entry< K,V>> list = FXCollections.observableArrayList(map.entrySet()); 

然后 setitems c> tableView.setItems(list);



当我运行这个JavaFX应用程序并显示1条记录时,一切正常。



问题是:

当我在地图中添加更多记录时,我的 TableView



如何将一个动态地图集合绑定到我的 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>实现
回调< TableColumn.CellDataFeatures< ObservableMap,V>,ObservableValue< V> {

private final Object key;

public ObservableMapValueFactory(Object key){
this.key = key;
}

@Override
public ObservableValue< V>调用(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(更改<?,?扩展V>更改){
if(key.equals(change.getKey ())){
property.set((V)map.get(key));
}
}
});
返回属性;


code


然后将其设置为单元格值工厂列(s)

  column.setCellValueFactory(new ObservableMapValueFactory< String>(columnId)); 

您的数据的所有更改都反映在TableView中,甚至只会影响ObservableMaps的更改。


Suppose that I have a map collection:

ObserableHashMap<K,V> map = FXCollections.observableHashMap();

I put 1 record into this map during fxml controller initialization, then wrap it as ObservableList:

ObservableList<ObserableHashMap.Entry<K,V>> list = FXCollections.observableArrayList(map.entrySet());

then setitems for my tableView.setItems(list);

Everything is fine when I run this JavaFX app and 1 record is showing.

Question is that:

When I add more records later to my map, my TableView will not refresh these records.

How could I bind a dynamical map collection into my TableView?

Thanks

解决方案

If you use an ObservableList of ObservableMaps as your TableView's data structure

ObservableList<ObservableMap> rowMaps = FXCollections.observableArrayList();
tableView.setItems(rowMaps);

and implement your own 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;
    }
}

and then set it as the cell value factory for your column(s)

column.setCellValueFactory(new ObservableMapValueFactory<String>(columnId));

all changes to your data are reflected in the TableView, even changes only affecting the ObservableMaps.

这篇关于JavaFX:使用HashMap绑定将行添加到TableView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆