与JavaFX 8的简单绑定

时间:2014-07-17 02:39:08

标签: data-binding javafx-8 observablelist

我一直在探索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)

有人可以帮我创建正确的语法将列表绑定到区域图表吗?如果我已经把所有混合的概念都搞砸了,请告诉我。

1 个答案:

答案 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及其使用示例。