Ошибка, которую вы получаете, вызвана добавлением одного и того же экземпляра Series
к тому же Chart
во второй раз. Ваш метод не учитывает, присутствует ли ряд в вашей диаграмме, поэтому повторный вызов метода естественным образом приводит к ошибке «дублирующая серия». Вызов series.getData().clear()
не решит проблему, потому что это очищает данные series , а не диаграммы data . К сожалению, они назвали оба свойства одним и тем же (то есть XYChart#getData()
и Series#getData()
), поскольку это может сбить с толку.
У вас есть как минимум два потенциальных решения, если вы продолжаете использовать один и тот же экземпляр Series
:
Удалите 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 .
Просто не добавляйте 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.