Ошибка получения повторяющейся серии при втором щелчке диаграммы. Как решить это? - PullRequest
3 голосов
/ 13 февраля 2020

Я пытаюсь получить графики по нажатию кнопки, но если я нажимаю кнопку во второй раз, возникает исключение повторяющихся серий. Кто-нибудь может мне помочь с этим?

заранее спасибо

Пробовал: 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 Ответ

2 голосов
/ 13 февраля 2020

Ошибка, которую вы получаете, вызвана добавлением одного и того же экземпляра Series к тому же Chart во второй раз. Ваш метод не учитывает, присутствует ли ряд в вашей диаграмме, поэтому повторный вызов метода естественным образом приводит к ошибке «дублирующая серия». Вызов series.getData().clear() не решит проблему, потому что это очищает данные series , а не диаграммы 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 Добавлено и JavaFX Duplicate дочерних PieChart .

  2. Просто не добавляйте Series на LineChart, если он уже присутствует.

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

Альтернативой является создание и использование нового Series экземпляра, если это необходимо.

Кроме того, вызов child2.getChildren().add(linechart); также должен вызывать исключение при повторном вызове вашего метода. По крайней мере, это произойдет после того, как вы исправите свою текущую проблему, поскольку текущее исключение останавливает выполнение этой строки. Один и тот же Node не может быть добавлен к одному и тому же Parent несколько раз - одна и та же проблема, другой (i sh) контекст.

Ваш метод, похоже, пытается сделать слишком много. Концептуально, похоже, что вы хотите, чтобы метод обновил график. Если это так, то нет необходимости «заново» добавлять Series к диаграмме или LineChart к родительскому элементу. Настройте пользовательский интерфейс при первой инициализации, а затем просто попросите метод обновить данные по мере необходимости. Выполнение этого означает, что вам не нужно использовать ни одно из перечисленных выше решений; это также лучший способ сделать все в целом.

Также обратите внимание, что вы используете raw types . Классы LineChart, Series и Data являются обобщенными c, но вы не указываете аргументы типа. Поскольку обе ваши оси 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 соглашениям об именах , особенно при публикации сообщений в форуме c.

...