我一直在探索JavaFX8几天,并试图用绑定的概念来教育自己。我已经创建了像这样的ObservableList
private static ObservableList<XYChart.Series<String, Number>> chartData = FXCollections.<XYChart.Series<String, Number>>observableArrayList();
然后我通过几个步骤创建一个AreaChart并成功调用下面的setAll()方法
areachart.getData().setAll(chartData);
虽然我的理解是绑定允许我通过将data属性与列表相关联来删除此步骤。如果列表更改,则图表数据属性将自动更新&#34;。
我试图像这样绑定数据属性
areachart.dataProperty().bind(chartData);
然而,它要求我根本不熟悉的语法
(ObservableValue<? extends ObservableList<Series<String, Number>>> arg0)
有人可以帮我创建正确的语法将列表绑定到区域图表吗?如果我已经把所有混合的概念都搞砸了,请告诉我。
答案 0 :(得分:2)
JavaFX的ObservableList
是一个特殊的List,可以通过附加一个事件处理程序来监视它的子操作。有关更多信息,请阅读相关的javadoc。
在JavaFX中,所有图表的祖先XYChart
都有一个dataProperty()
ObjectProperty<ObservableList<XYChart.Series<X,Y>>>
。即,这是一个属性字段,它包含一个类型为ObservableList的对象。这是您需要将其持有的可观察列表直接设置为
areachart.setData(chartData);
现在,areachart和chartData的数据引用相同的列表,任何删除/添加到chartData的内容都会“反映”到areachart的数据,反之亦然。
areachart.getData().setAll(chartData);
也有效但它会复制list-to-list。即它将在内部循环chartData并将其子项(在本例中为XYChart.Series)复制到areachart的数据可观察列表中。导致不同的列表,所以没有关系,它们之间没有“反射”。
在
areachart.dataProperty().bind(chartData);
错了。因为它试图约束property<list>
到list
。
即使dataProperty是ObjectProperty<ObservableList<XYChart.Series<X,Y>>>
,通过dataProperty()。bind()绑定它也会期望ObservableValue<? extends ObservableList<Series<String, Number>>>
,其中ObservableValue是ObjectProperty的超类。这是设计上的,关于这个主题的讨论在SO上,但不记得实际的Q&amp; A条目。尝试搜索它们。
在深入了解JavaFX之前,请参考Using JavaFX Properties and Binding和其他资源以更好地理解它。一般来说,属性是其持有对象的包装器,通过向其状态更改提供类似于模式的观察者,并且还提供通过JavaFX API插入其他属性对象的灵活性。请参阅网络上的Bindings及其使用示例。