JavaFX observableList как значение в карте - PullRequest
0 голосов
/ 17 ноября 2018

Поэтому я пытаюсь создать 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");

Но это дает мне ошибку в строке, где я назначаю слушателю значение ключа 1. Я положил FXCollections.observableArrayList() в качестве значения для ключа 1, потому что при создании наблюдаемого списка это назначаемое значение, поэтому я попытался установить его в качестве значения. Предложения компилятора не помогли. Причина, по которой я это делаю, состоит в том, чтобы создать наблюдаемую карту со значениями, которые я мог бы отслеживать / наблюдать, если произошло изменение.

Кто-нибудь может мне помочь? Любая помощь будет оценена. Спасибо!

1 Ответ

0 голосов
/ 17 ноября 2018

Метод 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()); 
...