我试图通过单击按钮获得图形,但是如果我第二次单击该按钮,它将抛出重复的系列异常。有人可以帮我吗?
预先感谢
已尝试:1. series.getData()。clear();
NumberAxis xaxis = new NumberAxis(2008,2018,1);
NumberAxis yaxis = new NumberAxis(10,80,5);
xaxis.setLabel("Year");
yaxis.setLabel("Price");
XYChart.Series series = new XYChart.Series();
LineChart linechart = new LineChart(xaxis,yaxis);
graph1.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
Linechart(X,Y,xaxis,yaxis);
}
private void Linechart(ArrayList <Integer> X, ArrayList<Integer> Y, NumberAxis xaxis, NumberAxis yaxis) {
series.getData().clear();
series.setName("Stock Analysis");
for(int i=0;i<=X.size()-1;i++){
series.getData().add(new XYChart.Data(X.get(i), Y.get(i)));
}
linechart.getData().add(series);
child2.getChildren().remove(area);
child2.getChildren().add(linechart);
}
您收到的错误是由于第二次将相同的Series
实例添加到相同的Chart
而引起的。如果序列中已经存在该方法,则不会考虑您的方法,因此第二次调用该方法自然会导致“重复序列”错误。调用series.getData().clear()
不会解决问题,因为这会清除series' data,而不是chart's data。不幸的是,它们将两个属性都命名为同一名称(即XYChart#getData()
和Series#getData()
),因为这可能会造成混淆。
假设您继续使用相同的Series
实例,您至少有两个潜在的解决方案:
从Series
中删除LineChart
,对其进行更新,然后再添加回去。
chart.getData().remove(series);
// update series
chart.getData().add(series); // side-effect: series moved to end of list
注意:如果图表是动画的,则此选项可能不起作用。参见JavaFX Duplicate Series Added和JavaFX Duplicate children PieChart。
[[0]如果已经存在,请不要将其添加到Series
中。
LineChart
另一种选择是创建并使用new if (!chart.getData().contains(series)) {
chart.getData().add(series);
}
实例,如果适用。
此外,一旦再次调用您的方法,则调用Series
也会导致引发异常。至少,一旦您解决了当前问题,它将立即执行,因为当前异常会阻止该行的执行。相同的child2.getChildren().add(linechart);
不能多次添加到相同的Node
-相同的问题,不同的上下文。
您的方法似乎尝试做太多事情。从概念上讲,您似乎希望方法更新图表。如果是这种情况,则无需将Parent
“重新添加”到图表或将“ Series
”添加到父级。首先初始化所有内容时,请设置用户界面,然后使该方法根据需要更新数据。这样,您就不必使用以上任何一种解决方案。这也是整体上更好的方法。
也请注意,您正在使用LineChart
。 raw types,LineChart
和Series
类都是通用的,但是您没有指定任何类型参数。由于两个轴都是Data
,因此您应该使用:
NumberAxis
LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);
Series<Number, Number> series = new Series<>();
(请注意菱形运算符:series.add(new Data<>(x.get(i), y.get(i)));
)。最后,请尝试遵循<>
,尤其是在发布到公共论坛上时。