【问题标题】:JavaFX chart: proper way to switch series dataJavaFX图表:切换系列数据的正确方法
【发布时间】:2016-05-11 15:59:51
【问题描述】:

我们有一个 java 程序,它接收一个 CSV 文件并将其处理成多组数据。数据在 XYChart 上一次显示一个,并带有一个可供选择的组合框。但是,我们不断遇到更新/更改数据的问题:

首先,每个数据系列都有一堆 ObservableList 对象,例如

ObservableList<XYChart.Data<T,V>> data = FXCollections.observableArrayList();

,每当更改选择框选择时,我们都会清除该系列,并添加与不同选择相对应的系列,例如

theChart.getData().clear();
theChart.getData().add(new XYChart.Series<T,V>(data));

但是,当 data 更新时,我们会收到错误,说明有关将相同数据添加到多个图表的内容。我认为如果事先为同一个data 调用了两次theChart.getData().add(new XYChart.Series&lt;T,V&gt;(data));,就会发生这种情况。

所以我把它包起来

XYChart.Series<T,V> series = new XYChart.Series<>(data);

并更改图表数据,如:

theChart.getData().clear();
theChart.getData().add(series);

在我的计算机上运行良好,但在另一台计算机上,当data 被清除然后added 到seriesonChanged 事件期间我们得到一个空指针异常,这表明某种竞争条件。

问题:

  • 更改 JavaFX 图表显示的系列的正确方法是什么?
  • 有没有办法“暂停”onChanged 事件,以便在图表尝试重绘之前更新整个数据系列。

【问题讨论】:

  • 您是在创建自己的线程,还是一直在使用 JavaFX 系统提供的应用程序线程?您是在混合 JavaFX 和 Swing 还是纯 JavaFX 应用程序?你能提供一个mcve 来复制你的问题吗?您使用的是什么版本的 JavaFX 和操作系统?是否所有机器都使用完全相同的 JavaFX 版本并运行相同的操作系统?
  • 请提供证明问题的SSCCE
  • @jewelsea 1. 使用 Platform.runLater 从另一个线程调用更新图表 2. 纯 JavaFX 3. 我将尝试创建一个 mcve 4. javafx.runtime.version=8.0.20, OS = OS X 10.10, java version=build 1.8.0_20-b26 5. 应该是相同的java版本,出错的机器是旧版本的OS X。
  • 我必须等到星期一才能创建 mcve,因为另一台计算机正在工作,但感谢您的建议。

标签: javafx-8


【解决方案1】:

你不能做一个clear(),那会抛出一个UnsupportedOperationException。更新图表的正确方法是设置一个新的空ObservableList,然后将具有正确XYChart.Data 对象的新XYChart.Series 添加到其中。

chart.setData(FXCollections.observableArrayList());
XYChart.Series<T, V> series = new XYChart.Series<T, V>();
XYChart.Data<T, V> data = new XYChart.Data<T, V>(t_type_Value, v_type_Value);

series.getData().add(data);

chart.getData().add(series);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2014-03-13
    相关资源
    最近更新 更多