Javafx 聆听移除观察者的单个元素

Javafx 聆听移除观察者的单个元素,javafx,Javafx,我有一个某个类的ObservableList,我想向列表中的单个元素添加一个侦听器,当该元素从列表中删除时,应该调用该元素。当然,我可以在整个列表中添加一个变更监听器,以检查删除的项是否正确,但是是否有更惯用的解决方案来解决这个问题,比如将元素包装在一个可观察的列表中(soobservateList),并向该可观察的列表添加一个invalizationListener之类的? 谢谢你的帮助 编辑: 我正在寻找一种将侦听器添加到ObservaleList的方法,该列表只在删除特定元素时启动。据我所

我有一个某个类的
ObservableList
,我想向列表中的单个元素添加一个侦听器,当该元素从列表中删除时,应该调用该元素。当然,我可以在整个列表中添加一个变更监听器,以检查删除的项是否正确,但是是否有更惯用的解决方案来解决这个问题,比如将元素包装在一个可观察的列表中(so
observateList
),并向该可观察的列表添加一个invalizationListener之类的? 谢谢你的帮助

编辑: 我正在寻找一种将侦听器添加到ObservaleList的方法,该列表只在删除特定元素时启动。据我所知,fx并不是天生就提供这种功能。

不,只有在删除特定元素时,
可观察列表才能通知侦听器。您只需添加一个
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);

}
导入java.util.Objects;
导入java.util.function.Predicate;
导入javafx.collections.ListChangeListener;
公共抽象类FilteredRemoveListChangeListener实现ListChangeListener{
private final PredicateNo,
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);

}
导入java.util.Objects;
导入java.util.function.Predicate;
导入javafx.collections.ListChangeListener;
公共抽象类FilteredRemoveListChangeListener实现ListChangeListener{

private final Predicate我使用JavaFX绑定库找到了一个简短的解决方案:

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

这将为您提供一个
可观察的isContained
,即
true
,确切地说,当
感兴趣的元素
包含在
列表中时,
否则为false
。倾听它的更改提供了解决方案。

我使用JavaFX绑定库找到了一个简短的解决方案:

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

这将为您提供一个
可观察的isContained
,即
true
,确切地说,当
感兴趣的元素
包含在
列表中时,
否则为false
时。倾听其更改提供了解决方案。

要收到从列表中删除的通知,您必须聆听…列表:)该项不知道它所在的位置不同(不应该,想象一下当它包含在多个列表中时通知会变得一团糟),因此它在逻辑上无法发送任何通知。无论如何,听起来像是一个x-y问题,最好解释一下你想要实现什么(最好是使用要收到从列表中删除的通知,您必须听…列表:)该项不知道它位于何处(并且不应该,想象一下当它包含在多个列表中时通知混乱),因此它在逻辑上无法发送任何通知。无论如何,听起来像个x-y问题,最好解释一下您想要实现的目标(最好使用)有趣的解决方案:)有趣的解决方案:)