Прослушивание удаления отдельных элементов ObservableList - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть ObservableList<T> некоторого класса, и я хочу добавить слушателя к отдельному элементу списка, который должен вызываться при удалении элемента из списка.Конечно, я мог бы добавить прослушиватель изменений ко всему списку, который проверяет, является ли удаленный элемент правильным, но есть ли более идиоматическое решение проблемы, например, обертывание элемента в Observable (т. Е. ObservableList<Observable<T>>) и добавлениеInvalidationListener для этого Observable или что-то?Спасибо за вашу помощь!

Редактировать: Я ищу способ добавить Listener в ObservableList, который срабатывает только при удалении определенного элемента.Насколько я могу судить, fx изначально не предоставляет такую ​​функциональность.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Я нашел короткое решение с использованием библиотеки JavaFX Bindings:

BooleanBinding isContained = Bindings.isNotEmpty(list.filtered(element ->  {
    return element == elementOfInterest;
}));
isContained.addListener ((obs, oldval, newval) -> {
    // do stuff
});

Это дает вам Observable<Boolean> isContained, то есть true именно тогда, когда elementOfInterest содержится в list и falseиначе.Прослушивание его изменений дает решение.

0 голосов
/ 12 февраля 2019

Нет, 1 не может ObservableList уведомлять слушателей только при удалении определенного элемента.Вы должны просто добавить ListChangeListener и реагировать соответствующим образом, когда нужный элемент был удален.Если вы хотите создать для этого класс многократного использования, он может выглядеть примерно так:

import java.util.Objects;
import java.util.function.Predicate;
import javafx.collections.ListChangeListener;

public abstract class FilteredRemoveListChangeListener<E> implements ListChangeListener<E> {

    private final Predicate<? super E> predicate;

    public FilteredRemoveListChangeListener(Predicate<? super E> predicate) {
        this.predicate = Objects.requireNonNull(predicate);
    }

    @Override
    public final void onChanged(Change<? extends E> c) {
        while (c.next()) {
            if (c.wasRemoved()) {
                c.getRemoved().stream().filter(predicate).forEachOrdered(this::onRemoved);
            }
        }
    }

    protected abstract void onRemoved(E element);

}

Возможно, вы захотите изменить onRemoved, чтобы он также брал источник ObservableList (полученный через Change.getList) в следующем порядке:делать такие вещи, как удаление слушателя, если это необходимо - что-то вроде onRemoved(ObservableList<? extends E> list, E element) 2 .


1.Технически вы могли бы реализовать свой собственный ObservableList, который делает это, но это излишне по сравнению с решением для слушателя, описанным выше.

2.Как обычно для ListChangeListener, не изменяйте элементы ObservableList изнутри слушателя .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...