简短:我正在寻找一种基于对地图中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; (值)水平?
答案 0 :(得分:1)
将Data
折射为JavaBean(是POJO)并使用(在DataCell#updateItem
中):
this.textProperty().bind(Bindings.concat(item.propertyOne(), " / ", item.propertyTwo()));
解决我的问题。