【发布时间】:2017-01-06 20:02:03
【问题描述】:
This answer 为 可观察列表 提供了一个解决方案,如果列表元素的属性 “更新列表” 通知,该列表将发送强>改变。
就我而言,这种可观察列表的元素(元素类)很复杂,我不喜欢为每个成员变量实现属性。因此,我在 Element 类 中添加了一个 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())。很奇怪,不是吗?
我可以以编程方式强制更新事件吗?
【问题讨论】:
标签: javafx observable