首页 > 解决方案 > JavaFX observableList 作为 Map 中的值

问题描述

所以我正在尝试创建一个 ObservableMap,其中 String 作为键,FXCollections.observableList 作为值

    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");

但它在我将 listener 分配给 key 的值的那一行给了我这个错误1。我将FXCollections.observableArrayList()其作为键的值,1因为在创建可观察列表时,这是分配的值,因此我尝试将其设置为值。编译器的建议没有帮助。我这样做的原因是创建一个可观察的地图,如果发生变化,我可以跟踪/观察这些值。

谁能帮我?任何帮助,将不胜感激。谢谢!

标签: javajavafxjavafx-8observable

解决方案


该方法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 */);

另一种选择是ListChangeListenerMapChangeListener.

// 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()); 

推荐阅读