如何绑定列表,如更新ForEach?

时间:2017-02-05 10:50:09

标签: javafx binding javafx-2

以下是示例代码:

public class Example3 {

    class Point {
        int x, y; // these can be properties if it matters
    }

    class PointRepresentation {
        Point point; // this can be a property if it matters

        public PointRepresentation(Point point) {
            this.point = point;
        }
    }

    Example3() {
        ObservableList<Point> points = FXCollections.observableArrayList();
        ObservableList<PointRepresentation> representations = FXCollections.observableArrayList();
        points.forEach(point -> representations.add(new PointRepresentation(point)));
    }
}

我有一个数据持有者Point和一个数据代表PointRepresentation。我有一个点列表,我希望列表中的每个点在第二个列表中有一个等效的表示对象。我给出的代码适用于初始化,但如果稍后有任何更改,则上述代码不会更新。

我现在正在做的是使用更改侦听器来同步列表(根据更改对象添加和删除元素)并且它没问题,但我想知道是否有更简单的解决方案。我正在寻找类似于&#34;的每个绑定&#34;这意味着:对于一个列表中的每个元素,在另一个列表中有一个元素,它们之间具有指定的关系[在我的情况下是它的构造函数]。在伪代码中:

representations.bindForEach(points, point -> new PointRepresentation(point));

我看过的东西:列表的提取器,但是当它们所持有的对象中的属性发生更改时发送更新,而不是在列表本身发生更改时发送更新。所以在我的情况下,如果点中的x发生变化,我可以制作一个通知它的提取器。我看到的另一件事是http://docs.oracle.com/javase/8/javafx/api/javafx/beans/binding/ListBinding.html,所以可能是自定义绑定,但我不知道它是否更简单。

对阵列而不是列表也有类似的解决方案吗?我认为http://docs.oracle.com/javase/8/javafx/api/javafx/collections/ObservableArray.html是可能的。

1 个答案:

答案 0 :(得分:0)

第三方库ReactFX具有此功能。你可以做到

ObservableList<Point> points = FXCollections.observableArrayList();
ObservableList<PointRepresentation> representations = LiveList.map(points, PointRepresentation::new);

这会在representations添加/删除等更改时自动更新points