Home >Java >javaTutorial >Why Does Updating a JFreeChart Series Dynamically Cause 'Index Out of Bounds' Exceptions?
Random errors when changing series using JFreeChart
Introduction
This question explores a problem encountered while attempting to dynamically update a series in a JFreeChart graph. The original implementation resulted in exceptions and incorrect data display.
Problem
The provided code aimed to modify a data series within a thread, but it encountered "Series index out of bounds" and "index out of bounds" exceptions. The graph display also malfunctioned. The reason for these errors was incorrect synchronization and the inappropriate use of a DateAxis.
Solution
The correct approach is to update the dataset from the process() method of a SwingWorker. Additionally, a NumberAxis should be used for the domain instead of a DateAxis. Here's a revised code snippet that demonstrates this solution:
private XYSeries series = new XYSeries("Result"); ... @Override protected void process(List<Double> chunks) { for (double d : chunks) { label.setText(df.format(d)); series.add(++n, d); } }
Discussion
Using a SwingWorker ensures proper synchronization and allows the dataset to be updated safely from within the worker thread. NumberAxis is appropriate for the domain because the X-axis represents the number of iterations, not a time period.
Alternative Approach
An alternative approach is to use a DynamicTimeSeriesCollection. However, this method is not suitable when the X-axis domain is based on iterations, not time periods, and requires updates when computations are complete, not at regular intervals.
Additional Notes
The provided code snippet creates a line chart that plots the progress of a calculation on the Y-axis. The X-axis represents the iteration number. The chart updates dynamically as the calculation progresses.
The above is the detailed content of Why Does Updating a JFreeChart Series Dynamically Cause 'Index Out of Bounds' Exceptions?. For more information, please follow other related articles on the PHP Chinese website!