JavaFX–;可观察列表和列表';s项目变更

JavaFX–;可观察列表和列表';s项目变更,javafx,observable,Javafx,Observable,为可观察列表提供解决方案,如果列表元素的属性发生更改,该列表将发送“列表更新”通知 在我的例子中,这种可观察列表的元素(元素类)是复杂的,我不喜欢为每个成员变量实现属性。因此,我在元素类中添加了一个布尔属性,该属性指示类的更改 元素类 可观察列表 observeList元素sobservableList=FXCollections.observeList( 新建ArrayList(), (元素)->新的可观察[]{Element.changeIndicatorProperty()} ); e

为可观察列表提供解决方案,如果列表元素的属性发生更改,该列表将发送“列表更新”通知

在我的例子中,这种可观察列表的元素(元素类)是复杂的,我不喜欢为每个成员变量实现属性。因此,我在元素类中添加了一个布尔属性,该属性指示类的更改


元素类


可观察列表

observeList元素sobservableList=FXCollections.observeList(
新建ArrayList(),
(元素)->新的可观察[]{Element.changeIndicatorProperty()}
);
elementsObservableList.addListener(新的ListChangeListener(){
@凌驾
更改后的公共空间(更改)
这很奇怪,不是吗

不,这并不奇怪。要触发更改,需要进行更改。如果
布尔属性
确定没有更改,因此侦听器没有收到任何通知,这仍然满足
属性
的约定

实际上,无论如何都不需要
属性
。需要的是通知其观察者的
可观察的
。您可以使用以下类并调用
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) {
            }
        }
    }

}
公共类SimpleObservable实现可观察{
私有最终列表侦听器=新的LinkedList();
@凌驾
public void addListener(invalizationListener侦听器){
添加(侦听器);
}
@凌驾
公共void RemovelListener(InvalizationListener侦听器){
删除(侦听器);
}
公共无效{
for(无效侦听器:侦听器){
试一试{
无效(这个);
}捕获(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();
    }

}
公共类元素{
受保护的最终SimpleObservable observable=新SimpleObservable();
公共可观察的getObservable(){
可观测收益;
}
公共静态ObservableList observableArrayList(){
返回FXCollections.observableArrayList(e->new Observable[]{e.Observable});
}
私有void更新(){
可观察的;无效的;
}
公共静态void main(字符串[]args){
ObservableList=元素。observableArrayList();
list.addListener((ListChangeListener.Change
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();
    }

}