第二次单击图表时出现重复系列错误。如何解决这个问题?

Getting Duplicate series error on second click for chart. How to resolve this?

我试图通过单击按钮获取图表,但如果我第二次单击该按钮,它会抛出重复系列异常。谁能帮我解决这个问题?

提前致谢

试过: 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 引起的。您的方法不会考虑该系列是否已存在于您的图表中,因此第二次调用该方法自然会导致 "duplicate series" 错误。调用 series.getData().clear() 不会解决问题,因为这会清除 series' data, not the chart's data。不幸的是,他们将两个属性命名为相同的东西(即 XYChart#getData()Series#getData()),因为它会让人感到困惑。

假设您继续使用同一个 Series 实例,您至少有两个可能的解决方案:

  1. LineChart 中删除 Series,更新它,然后再添加回来。

    chart.getData().remove(series);
    // update series
    chart.getData().add(series); // side-effect: series moved to end of list
    

    注意:如果图表是动画的,此选项可能不起作用。见 JavaFX Duplicate Series Added and .

  2. 如果 Series 已经存在,请不要将 Series 添加到 LineChart

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

另一种方法是创建并使用 new Series 实例(如果合适)。

此外,调用 child2.getChildren().add(linechart); 也应该会导致在第二次调用您的方法时抛出异常。至少,一旦您解决了当前的问题,它就会执行,因为当前的异常会阻止该行的执行。相同的 Node 不能多次添加到相同的 Parent - 相同的问题,不同的(大概)上下文。

您的方法似乎试图做太多事情。从概念上讲,您似乎希望该方法 更新 图表。如果是这种情况,则无需 "re-add" 图表的 Series 或父级的 LineChart。首先初始化所有内容时设置用户界面,然后让方法根据需要更新数据。这样做意味着您不必使用上述任何一种解决方案;这也是一种更好的整体做事方式。

另请注意,您使用的是 raw typesLineChartSeriesData 类 都是通用的,但您没有指定任何类型参数。由于你的两个轴都是 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 naming conventions,尤其是在 public 论坛发帖时。