带有提取器值的ObservableMap?

时间:2016-12-26 23:38:09

标签: java javafx observable

简短:我正在寻找一种基于对地图中ListView所做的更改来更新Map内容的方法。

情况:

有&#34;来源&#34; LinkedHashMap<String, Data>在应用程序的逻辑方面。

在GUI部分有一个ListView,如:

// Gui list.
ListView<Data> list = new ListView<>();

// Observable map wrapping logical map
ObservableMap<String, Data> items = FXCollections.observableMap(logic.getLogicalMap());
// This listener will cause gui list to also change logical list
items.addListener((MapChangeListener<String, Data>) change ->
{
    list.getItems().removeAll(change.getValueRemoved());
    if (change.wasAdded())
    {
        list.getItems().add(change.getValueAdded());
    }
});
// Show values of map in ListView.
list.getItems().setAll(items.values());

list.setCellFactory(new Callback<ListView<Data>, ListCell<Data>>()
{
    @Override
    public ListCell<Data> call(ListView<Data> list)
    {
        return new DataCell();
    }
});
// Basically cells that update when map is updated.
private static class DataCell extends ListCell<Data>
{
    @Override
    public void updateItem(Data item, boolean empty)
    {
        super.updateItem(item, empty);

        if (item != null)
        {
            this.setText(item.toString());
        }
        else
        {
            this.setText("");
        }
    }
}

现在:在我希望单元格显示对Data中包含的Map#values()所做的更改之前,一切都很酷。

我遇到了Extractors,但显然它们只适用于ObservableLists。 所以现在:我如何通知ObservableMap(然后通知ListView)发生在&#34; cellular&#34; (值)水平?

1 个答案:

答案 0 :(得分:1)

Data折射为JavaBean(是POJO)并使用(在DataCell#updateItem中):

this.textProperty().bind(Bindings.concat(item.propertyOne(), " / ", item.propertyTwo()));

解决我的问题。