我有某个类的ObservableList<T>
,并且我想向列表中的单个元素添加一个侦听器,当该元素从列表中删除时应调用该监听器。当然,我可以在整个列表中添加一个更改侦听器,以检查所删除的项目是否正确,但是是否存在针对该问题的更惯用的解决方案,例如将元素包装在Observable中(因此ObservableList<Observable<T>>
)并将InvalidationListener添加到该Observable之类的东西?
感谢您的帮助!
编辑: 我正在寻找一种将侦听器添加到仅在删除特定元素时才会触发的ObservableList的方法。据我所知,fx本身并不提供该功能。
答案 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
的元素。