我试图得到一个按钮点击图形,但如果我点击按钮的第二次它是抛出一个重复序列异常。有人能帮我吗?
提前谢谢
尝试: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);
}
1条答案
按热度按时间0ejtzxu11#
您得到的错误是由添加相同的
Series
示例到同一个Chart
第二次。您的方法不考虑序列是否已经存在于图表中,因此第二次调用该方法自然会导致“重复序列”错误。打电话series.getData().clear()
不会解决问题,因为这会清除序列的数据,而不是图表的数据。不幸的是,他们将这两处房产命名为同一事物(即。XYChart#getData()
以及Series#getData()
)因为这会让人困惑。假设您继续使用相同的解决方案,您至少有两个潜在的解决方案
Series
示例:拆下
Series
从LineChart
,更新它,然后再添加回来。注意:如果图表已设置动画,则此选项可能不起作用。请参阅javafx duplicate series added和javafx duplicate children piechart。
只需不添加
Series
到LineChart
如果它已经存在。另一种方法是创建和使用新的
Series
例如,如果合适的话。另外,打电话
child2.getChildren().add(linechart);
还应该导致在第二次调用方法时引发异常。至少,当当前异常停止执行该行时,它将在您修复当前问题之后生效。相同的Node
不能添加到同一个Parent
多次出现相同的问题,不同的背景。你的方法似乎做得太多了。从概念上讲,您似乎希望该方法更新图表。如果是这样的话,那么就没有必要再加上
Series
到图表或LineChart
给父母。在初始化所有内容时设置用户界面,然后让方法根据需要更新数据。这样做意味着你不必使用上述任何一种解决方案;总的来说,这也是一种更好的做事方式。还要注意,您使用的是原始类型。这个
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)));
(注意菱形操作符:<>
).最后,尝试遵循java命名约定,尤其是在发布到公共论坛时。