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

问题描述 投票:0回答:1

我试图通过单击按钮获得图形,但是如果我第二次单击该按钮,它将抛出重复的系列异常。有人可以帮我吗?

预先感谢

已尝试: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);

             }
java javafx linechart
1个回答
0
投票

您收到的错误是由于第二次将相同的Series实例添加到相同的Chart而引起的。如果序列中已经存在该方法,则不会考虑您的方法,因此第二次调用该方法自然会导致“重复序列”错误。调用series.getData().clear()不会解决问题,因为这会清除series' data,而不是chart's data。不幸的是,它们将两个属性都命名为同一名称(即XYChart#getData()Series#getData()),因为这可能会造成混淆。

假设您继续使用相同的Series实例,您至少有两个潜在的解决方案:

  1. Series中删除LineChart,对其进行更新,然后再添加回去。

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

    注意:如果图表是动画的,则此选项可能不起作用。参见JavaFX Duplicate Series AddedJavaFX Duplicate children PieChart

  2. [[0]如果已经存在,请不要将其添加到Series中。

    LineChart

另一种选择是创建并使用new if (!chart.getData().contains(series)) { chart.getData().add(series); } 实例,如果适用。

此外,一旦再次调用您的方法,则调用Series也会导致引发异常。至少,一旦您解决了当前问题,它将立即执行,因为当前异常会阻止该行的执行。相同的child2.getChildren().add(linechart);不能多次添加到相同的Node-相同的问题,不同的上下文。

您的方法似乎尝试做太多事情。从概念上讲,您似乎希望方法更新图表。如果是这种情况,则无需将Parent“重新添加”到图表或将“ Series”添加到父级。首先初始化所有内容时,请设置用户界面,然后使该方法根据需要更新数据。这样,您就不必使用以上任何一种解决方案。这也是整体上更好的方法。

也请注意,您正在使用LineChartraw typesLineChartSeries类都是通用的,但是您没有指定任何类型参数。由于两个轴都是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)));)。

最后,请尝试遵循<>,尤其是在发布到公共论坛上时。

© www.soinside.com 2019 - 2024. All rights reserved.