听取ObservableList单个元素的删除

时间:2019-02-12 13:05:07

标签: javafx

我有某个类的ObservableList<T>,并且我想向列表中的单个元素添加一个侦听器,当该元素从列表中删除时应调用该监听器。当然,我可以在整个列表中添加一个更改侦听器,以检查所删除的项目是否正确,但是是否存在针对该问题的更惯用的解决方案,例如将元素包装在Observable中(因此ObservableList<Observable<T>>)并将InvalidationListener添加到该Observable之类的东西? 感谢您的帮助!

编辑: 我正在寻找一种将侦听器添加到仅在删除特定元素时才会触发的ObservableList的方法。据我所知,fx本身并不提供该功能。

2 个答案:

答案 0 :(得分:3)

I found a short solution using the JavaFX Bindings library:

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

This gives you an Observable<Boolean> isContained that is true exactly when elementOfInterest is contained in list and false otherwise. Listening to its changes provides the solution.

答案 1 :(得分:2)

否,ObservableList 1 无法仅在删除特定元素时通知监听器。您只需要添加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获得),以进行诸如在需要时删除侦听器的操作,例如{{1} } 2


1。从技术上讲,您可以实现自己的onRemoved(ObservableList<? extends E> list, E element),但是与上面的侦听器解决方案相比,这太过分了。

2。与ObservableList一样,不要从侦听器内部修改ListChangeListener的元素