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