从 ArrayList 中存储的数据动画化 CandleStick 图表
Animating CandleStick Chart from Data Stored in ArrayList
我将一秒钟的烛台数据存储在 'BarData' 对象的 ArrayList 中,其中包含开盘价、最高价、最低价和收盘价数据以及时间戳。我将这些数据聚合到 5 分钟的条形图中,并在自定义的 JavaFX XYChart 上显示数据以生成蜡烛图。
聚合代码工作正常,我可以显示从 1 秒柱创建的 5 分钟柱。
现在我想使用列表中的 24,300 组 1 秒数据动画创建 5 分钟图表,这样我就可以像实时市场数据馈送一样重播数据。
我曾尝试使用时间轴,但遇到困难。我是否需要为系列数据的每次更新创建一个关键帧?
这是将 'sublist' 中的 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);
强制图表重绘柱形图无效。为了让栏立即更新,我不得不删除栏,然后 re-add 栏。这似乎是一个奇怪的解决方法,但它确实有效。如果有人有更好的答案,我会很高兴听到。
series.getData().remove(idxOfLastBarInList);
series.getData().add(new XYChart.Data<>(label, prevBar.getOpen(), prevBar));
用 'remove' 替换 'set' 代码,然后 'add' 确保我的蜡烛被重新绘制。
我将一秒钟的烛台数据存储在 'BarData' 对象的 ArrayList 中,其中包含开盘价、最高价、最低价和收盘价数据以及时间戳。我将这些数据聚合到 5 分钟的条形图中,并在自定义的 JavaFX XYChart 上显示数据以生成蜡烛图。
聚合代码工作正常,我可以显示从 1 秒柱创建的 5 分钟柱。
现在我想使用列表中的 24,300 组 1 秒数据动画创建 5 分钟图表,这样我就可以像实时市场数据馈送一样重播数据。
我曾尝试使用时间轴,但遇到困难。我是否需要为系列数据的每次更新创建一个关键帧?
这是将 'sublist' 中的 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);
强制图表重绘柱形图无效。为了让栏立即更新,我不得不删除栏,然后 re-add 栏。这似乎是一个奇怪的解决方法,但它确实有效。如果有人有更好的答案,我会很高兴听到。
series.getData().remove(idxOfLastBarInList);
series.getData().add(new XYChart.Data<>(label, prevBar.getOpen(), prevBar));
用 'remove' 替换 'set' 代码,然后 'add' 确保我的蜡烛被重新绘制。