以下是示例代码:
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是可能的。
答案 0 :(得分:0)
第三方库ReactFX具有此功能。你可以做到
ObservableList<Point> points = FXCollections.observableArrayList();
ObservableList<PointRepresentation> representations = LiveList.map(points, PointRepresentation::new);
这会在representations
添加/删除等更改时自动更新points
。