可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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 years and I would like to change 3 years by 5 years. I want the chart to change immediately.
Is there some kind of update chart or something like that ?
I know that you could say "get your TaskSeries, do your changes and it will be refreshed automatically" but my TaskSeries are generated and I cannot easily change these ones. That's why I would like to find a way to recalculate and to rebuild the whole chart.
I hope I am enough clear, it's not easy to explain.
Thanks for your help,
Johann
回答1:
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.
回答2:
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.
回答3:
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 }
回答4:
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.
回答5:
// 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();
回答6:
What worked with me was the following:
//reset with new dataset chart().setDataset(dataset); repaint the ChartPanel that contains the JFreeChart chartPanel.repaint();