所以我试图创建一个以字符串为键,以FXCollections.observableList作为值的ObservableMap
Map<String, ObservableList<String>> namesMap = new HashMap<>();
ObservableMap<String, ObservableList<String>> names = FXCollections.observableMap(namesMap);
names.addListener(new MapChangeListener<String, List<String>>() {
@Override
public void onChanged(MapChangeListener.Change<? extends String, ? extends List<String>> change) {
System.out.println("Detected a change!");
System.out.println(change.getValueAdded());
}
});
names.put("1", FXCollections.observableArrayList().addListener(new ListChangeListener<String>(){
@Override
public void onChanged(ListChangeListener.Change<? extends String> c) {
//to-do
}
}));
names.get("1").add("One");
但是它在我向侦听器分配键1
的值的那一行给了我error。我将FXCollections.observableArrayList()
用作键1
的值,因为在创建可观察列表时,这是分配的值,因此我尝试将其设置为值。编译器的建议没有帮助。我这样做的原因是创建一个可观察的地图,并使用值可以跟踪/观察是否发生了更改。
有人可以帮助我吗?任何帮助,将不胜感激。谢谢!
答案 0 :(得分:1)
方法ObservableList.addListener
不返回任何内容(即void
)。这表示您正在呼叫names.put("1", void)
,这是无效的。
您需要创建ObservableList
并单独添加侦听器。
ObservableList<String> list = FXCollections.observableArrayList();
list.addListener(/* your listener */);
names.put("1", list);
// OR
// Less efficient since you have to perform a lookup
// in order to add the listener.
names.put("1", FXCollections.observableArrayList());
names.get("1").addListener(/* your listener */);
另一种选择是在ListChangeListener
内添加MapChangeListener
。
// Stored in variable so it can be removed if necessary
final ListChangeListener<String> listListener = listChange -> {
// TODO: Implement...
};
names.addListener((MapChangeListener<String, ObservableList<String>>) mapChange -> {
if (mapChange.wasAdded()) {
mapChange.getValueAdded().addListener(listListener);
}
if (mapChange.wasRemoved()) {
mapChange.getValueRemoved().removeListener(listListener);
}
});
// ListChangeListener will now be added automatically by the MapChangeListener
names.put("1", FXCollections.observableArrayList());