Нет, 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
изнутри слушателя .