gpt4 book ai didi

JavaFX - ObservableList 和列表项的变化

转载 作者:行者123 更新时间:2023-12-04 12:49:12 26 4
gpt4 key购买 nike

This answer可观察列表提供解决方案,如果列表元素的属性更改,它将发送“列表已更新” 通知>.

在我的例子中,此类可观察列表的元素(元素类)很复杂,我不喜欢为每个成员变量实现属性。因此,我在 Element class 中添加了一个 BooleanProperty 来指示类的变化。


元素类

import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.property.ReadOnlyBooleanWrapper;

public class Element {
// ...
private ReadOnlyBooleanWrapper changeIndicatorWrapper;

public Element() {
//...
changeIndicatorWrapper = new ReadOnlyBooleanWrapper(false);
}

public ReadOnlyBooleanProperty changeIndicatorProperty() {
return changeIndicatorWrapper.getReadOnlyProperty();
}

public void someMethod() {
// Some update
changeIndicatorWrapper.set(!changeIndicatorWrapper.get());
}
}

可观察列表

ObservableList<Element> elementsObservableList = FXCollections.observableList(
new ArrayList<>(),
(Element element) -> new Observable[] { element.changeIndicatorProperty() }
);

elementsObservableList.addListener(new ListChangeListener<Element>() {
@Override
public void onChanged(Change<? extends Element> c) {
System.out.println("CHANGE");
while(c.next()) {
if (c.wasUpdated()) {
for (int i = c.getFrom(); i < c.getTo(); ++i)
System.out.println(elementsObservableList.get(i));
}
}
}
});

我的问题是关于这种方法。反复将 changeIndicatorProperty 设置为 true 不会触发更改事件。因此,我需要每次都反转changeIndicatorProperty 值 changeIndicatorWrapper.set(!changeIndicatorWrapper.get())。这很奇怪,不是吗?

我能否以编程方式强制执行更新事件?

最佳答案

It is strange, isn't it?

不,这并不奇怪。要触发更改,需要发生更改。如果 BooleanProperty 确定没有发生任何变化,因此听众不会收到任何通知,这仍然满足 Property 的约定。

实际上,无论如何都不需要 Property。需要的是一个通知它的观察者的Observable。您可以通过使用以下类并调用 invalidate 来完成此操作:

public class SimpleObservable implements Observable {

private final List<InvalidationListener> listeners = new LinkedList<>();

@Override
public void addListener(InvalidationListener listener) {
listeners.add(listener);
}

@Override
public void removeListener(InvalidationListener listener) {
listeners.remove(listener);
}

public void invalidate() {
for (InvalidationListener listener : listeners) {
try {
listener.invalidated(this);
} catch (RuntimeException ex) {
}
}
}

}

例子:

public class Element {

protected final SimpleObservable observable = new SimpleObservable();

public Observable getObservable() {
return observable;
}

public static <T extends Element> ObservableList<T> observableArrayList() {
return FXCollections.observableArrayList(e -> new Observable[]{e.observable});
}

private void update() {
observable.invalidate();
}

public static void main(String[] args) {
ObservableList<Element> list = Element.observableArrayList();
list.addListener((ListChangeListener.Change<? extends Element> c) -> {
while (c.next()) {
if (c.wasUpdated()) {
System.out.println("update: [" + c.getFrom() + ", " + c.getTo() + ")");
}
}
});
list.addAll(new Element(), new Element(), new Element());
list.get(1).update();
}

}

关于JavaFX - ObservableList 和列表项的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41513455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com