0

几天来我一直在探索 JavaFX8,并试图用绑定的概念来教育自己。我已经创建了一个像这样的 ObservableList

private static ObservableList<XYChart.Series<String, Number>> chartData = FXCollections.<XYChart.Series<String, Number>>observableArrayList();

然后,我通过几个步骤创建了一个 AreaChart,并成功调用了下面的 setAll() 方法

areachart.getData().setAll(chartData);

我的理解是,绑定将允许我通过将数据属性与列表相关联来删除此步骤。如果列表发生变化,图表数据属性将自动“更新”。

我试图像这样绑定数据属性

areachart.dataProperty().bind(chartData);

但是,它要求我完全不熟悉的语法

(ObservableValue<? extends ObservableList<Series<String, Number>>> arg0)

有人可以帮我创建正确的语法以将列表绑定到面积图吗?如果我把绑定的概念搞混了,请告诉我。

4

1 回答 1

2

JavaFXObservableList是特殊的列表,可以通过将事件处理程序附加到它来观察其子操作。请阅读相关的 javadocs 以获取更多信息。

在所有图表的祖先 JavaFX 中,XYChart都有一个dataProperty()which 是ObjectProperty<ObservableList<XYChart.Series<X,Y>>>. 也就是说,这是一个属性字段,其中包含一个类型为 ObservableList 的对象。这是您需要将其持有可观察列表直接设置为的字段

areachart.setData(chartData);

现在 areachart 和 chartData 的数据引用了同一个列表,任何删除/添加到 chartData 都将“反映”到 areachart 的数据,反之亦然。

areachart.getData().setAll(chartData);

也是有效的,但它会复制列表到列表。即它将在内部循环chartData 并将其子项(在本例中为XYChart.Series)复制到areachart 的数据可观察列表中。导致不同的列表,所以它们之间没有关系,没有“反射”。

areachart.dataProperty().bind(chartData);

是错的。因为它试图绑定,粗略地说,property<list>to list

即使 dataProperty 是ObjectProperty<ObservableList<XYChart.Series<X,Y>>>,通过 dataProperty().bind() 绑定到它也会期望ObservableValue<? extends ObservableList<Series<String, Number>>>,其中 ObservableValue 是 ObjectProperty 的超类。这是设计使然,在 SO 上对此主题进行了讨论,但不记得实际的问答条目。尝试搜索它们。

在深入了解 JavaFX 之前,请参阅Using JavaFX Properties and Binding和其他资源以更好地理解它。一般来说,属性是其持有对象的包装器,通过为其状态更改提供类似观察者的模式,并提供通过 JavaFX API 插入其他属性对象的灵活性。例如,请参阅网络上的Bindings及其使用示例。

于 2014-07-17T09:55:29.307 回答