我正在尝试在javafx中开发动态折线图并编写此代码。代码工作正常,但绘制的数据不断填充图表区域,变得一团糟。我想要的是开始移动或移动xAxis左侧的数据,但不知道如何做到这一点。 此外,代码还会生成异常"已添加重复系列" 。怎么了?
@FXML
LineChart<Number, Number> lineChart;
public void chartLine() {
XYChart.Series<Number, Number> series = new XYChart.Series<>();
Task<Void> task = new Task<Void>() {
@Override protected Void call() throws Exception {
final int[] j = {0};
for (int i=0; i<10000; i++) {
if (isCancelled()) break;
Platform.runLater(new Runnable() {
@Override public void run() {
series.getData().add(new XYChart.Data(j[0]++, Math.random()));
lineChart.getData().add(series);
}
});
Thread.sleep(500);
}
return null;
}
};
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
}
答案 0 :(得分:0)
我花了好几个小时就得到了它。使用xAxis.setForceZeroInRange(false);
并在series.getData().remove(0);
时设置series.getData().size()>20
。使用此最终代码后也会删除异常。
@FXML
LineChart<Number, Number> lineChart;
@FXML
private NumberAxis xAxis;
@FXML
private NumberAxis yAxis;
public void chartLine() {
XYChart.Series<Number, Number> series = new XYChart.Series<>();
xAxis.setForceZeroInRange(false);
lineChart.setLegendVisible(false);
Task<Void> task = new Task<Void>() {
@Override protected Void call() throws Exception {
final int[] j = {0};
for (int i=0; i<10000; i++) {
if (isCancelled()) break;
Platform.runLater(() -> {
series.getData().add(new XYChart.Data(j[0]++, Math.random()));
if (series.getData().size()>20) {
series.getData().remove(0);
}
});
Thread.sleep(2000);
}
return null;
}
};
lineChart.getData().add(series);
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
}