I would like to know how to refresh a chart if we want to change \"in live\" some piece of data. I mean for instance, I have a chart with a TaskSeries which appears on 3 yea
I had this issue; I did it using this:
private void refreshChart() {
jPanel_GraphicsTop.removeAll();
jPanel_GraphicsTop.revalidate(); // This removes the old chart
aChart = createChart();
aChart.removeLegend();
ChartPanel chartPanel = new ChartPanel(aChart);
jPanel_GraphicsTop.setLayout(new BorderLayout());
jPanel_GraphicsTop.add(chartPanel);
jPanel_GraphicsTop.repaint(); // This method makes the new chart appear
}
What worked with me was the following:
//reset with new dataset
chart().setDataset(dataset);
repaint the ChartPanel that contains the JFreeChart
chartPanel.repaint();
// create a chart
ChartFrame mychartframe = new ChartFrame("my charts", chart);
// some other stuff ...
// somewhere else in a code far far away
mychartframe.getChartPanel().getChart().fireChartChanged();
The add()
method of TaskSeries automatically sends a SeriesChangeEvent to all registered listeners, e.g. CategoryPlot
. In this example, DynamicTimeSeriesCollection
implements SeriesChangeEvent. In this case, the chart's XYPlot
is a registered listener.
I haven't found an easy way to update a JFreeChart "live", since the data-structure of jfreechart is very incompatible to my data-structure. So I build a redraw()-Method of my own, that collects the data from my dataModel, build up a JFreeChart dataModel and set the chart new.
This gives the feeling of a "live" update, also it is very ugly.
I had this issue too with an XYPlot. I found a workaround by resetting the dataset:
chart.getXYPlot().setDataset(chart.getXYPlot().getDataset());
that's crazy but it works...
Note: chart.setNotify(true)
seems to do nothing.