我有一秒烛台数据存储在“ BarData”对象的ArrayList中,其中包含打开,高,低和关闭数据以及时间戳。我将这些数据汇总到5分钟的条形中,并将数据显示在自定义的JavaFX XYChart上以生成蜡烛。

聚合代码工作正常,我可以显示从1秒条创建的5分钟条。

现在,我要使用清单中拥有的24,300组1秒数据为5分钟图表的创建动画,以便像实时市场数据馈送一样重放数据。

我尝试使用时间轴,但正在挣扎。我需要为系列数据的每次更新创建一个KeyFrame吗?

这是将“子列表”中的1秒数据聚合为5分钟图表的工作循环。谁能建议我如何制作动画呢?

        for (BarData bar : sublist)
        {
           String label = "";
           if ((bar.getDateTime().getMinute()%5 == 0) && bar.getDateTime().getSecond() == 0)
           {
              label = dtf.format(bar.getDateTime());
              series.getData().add(new XYChart.Data<>(label, bar.getOpen(), bar));
           }
           else
           {
              // Just updating values so no need to update label.
              int idxOfLastBarInList = series.getData().size()-1;
              XYChart.Data<String, Number> data = series.getData().get(idxOfLastBarInList);
              BarData prevBar = (BarData)(data.getExtraValue());
              prevBar.update(bar); // Modifies bar based on new bar data.
              data.setExtraValue(prevBar);
              series.getData().set(idxOfLastBarInList, data);
           }
        }


图表最终看起来像这样:

Sample Chart

最佳答案

经过一些工作,我意识到这一行:

series.getData().set(idxOfLastBarInList, data);


无法强制图表重新绘制柱线。为了使该栏立即更新,我必须删除该栏,然后重新添加该栏。看来这是一个奇怪的解决方法,但确实可以。如果有人有更好的答案,我将很高兴听到。

series.getData().remove(idxOfLastBarInList);
series.getData().add(new XYChart.Data<>(label, prevBar.getOpen(), prevBar));


将“设置”代码替换为“删除”,然后替换为“添加”,以确保重绘了我的蜡烛。

07-24 17:57
查看更多