【问题标题】:Simple binding with JavaFX8与 JavaFX8 的简单绑定
【发布时间】:2014-07-17 02:39:07
【问题描述】:

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

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

【问题讨论】:

    标签: data-binding javafx-8 observablelist


    【解决方案1】:

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

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

    areachart.setData(chartData);
    

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

    areachart.getData().setAll(chartData);
    

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

    areachart.dataProperty().bind(chartData);
    

    错了。因为它试图将property&lt;list&gt; 绑定到list

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2014-11-14
      • 1970-01-01
      • 2014-10-21
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多