将XYChart.Data添加到XYChart.Series

时间:2017-10-06 12:13:24

标签: java javafx javafx-8

我正在尝试在XYChart中为音频文件绘制波形。我有一系列样本。但是将每个样本添加到XYChart.Data,然后通过for循环将XYChart.Data添加到XYChart.Series,即使是2秒的文件也需要太长时间。有没有其他方法可以一次性将样本数组中的所有值添加到Series?以下是我目前的代码:

XYChart.Series<Integer,Double> dataSeries1 = new XYChart.Series<>();
XYChart.Data<Integer,Double> data = new XYChart.Data<>();

for (int i=0;i<numsamples;i++) {
    data = new XYChart.Data<Integer,Double>( i, samples[i]);
    dataSeries1.getData().add(data);
}   
lineChart.getData().clear();
lineChart.getData().add(dataSeries1);

1 个答案:

答案 0 :(得分:0)

我猜你要求这部分代码:

for (int i=0;i<numsamples;i++) {
    data = new XYChart.Data<Integer,Double>( i, samples[i]);
    dataSeries1.getData().add(data);
}   

您可以先在另一个集合中收集它,然后一次性添加它们:

Collection<XYChar.Data<Integer,Double>> samples = new ArrayList<>(numsamples);

for (int i = 0; i < numsamples; i++) {
     XYChart.Data sample = new XYChart.Data<Integer,Double>( i, samples[i]);
     samples.getData().add(sample);
}   

dataSeries1.getData().addAll(samples);

然而,我认为你不会在这方面遇到性能提升。它甚至可能更慢,因为必须在addAll函数中再次复制数据点

在这两种情况下,您都要将数据添加到集合中。当您添加控件时不会尝试重新绘制自身,它只是指示它已经失效的平台并在下一个可用脉冲上请求重新布局。当你的循环在平台线程上时,下一个脉冲将不会发生,直到你完成循环。

要么花费很多时间来添加所有的采样点,一旦你将它添加到数据系列中,图表就需要花费很多时间来绘制它们。如果你有一个大型系列,控制真的需要一些时间。

或者,您可以在Task中创建样本数据集,在其中您可以在另一个线程中创建样本集合,并在task completion上一次性应用它们。创建集合仍将花费时间 - 但不会阻止平台线程 - 并且控件仍需要时间来呈现自身。