第二次单击图表时出现重复序列错误如何解决?

arknldoa  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(277)

我试图得到一个按钮点击图形,但如果我点击按钮的第二次它是抛出一个重复序列异常。有人能帮我吗?
提前谢谢
尝试: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);

             }
0ejtzxu1

0ejtzxu11#

您得到的错误是由添加相同的 Series 示例到同一个 Chart 第二次。您的方法不考虑序列是否已经存在于图表中,因此第二次调用该方法自然会导致“重复序列”错误。打电话 series.getData().clear() 不会解决问题,因为这会清除序列的数据,而不是图表的数据。不幸的是,他们将这两处房产命名为同一事物(即。 XYChart#getData() 以及 Series#getData() )因为这会让人困惑。
假设您继续使用相同的解决方案,您至少有两个潜在的解决方案 Series 示例:
拆下 SeriesLineChart ,更新它,然后再添加回来。

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。
只需不添加 SeriesLineChart 如果它已经存在。

if (!chart.getData().contains(series)) {
  chart.getData().add(series);
}

另一种方法是创建和使用新的 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命名约定,尤其是在发布到公共论坛时。

相关问题