2011-06-01 25 views
5

我想知道如何更新图表,如果我们想更改“实时”某些数据。我的意思是,例如,我有一个带有3年出现的TaskSeries的图表,并且我希望将3年改为5年。我希望图表立即改变。Jfreechart - 根据更改数据刷新图表

是否有某种更新图表或类似的东西?我知道你可以说“让你的TaskSeries,做你的改变,它会自动刷新”,但我的TaskSeries生成,我不能轻易改变这些。这就是为什么我想找到重新计算和重建整个图表的方法。

我希望我已经够清楚了,这不容易解释。

感谢您的帮助,

约翰

回答

0

我还没有找到一个简单的方法来更新JFreeChart的“活”,因为jfreechart的数据结构是我的数据结构极不相称。因此,我构建了一个redraw() - 我自己的方法,它从我的dataModel收集数据,构建一个JFreeChart数据模型并将图表设置为新的。

这给出了“实时”更新的感觉,也是非常丑陋的。

+1

我发现JFreeChart的方式与Swing的[可分离模型架构]非常兼容(http://java.sun.com/products/jfc/TSC /用品/建筑/)。 – trashgod 2011-06-01 19:34:27

6

add()方法TaskSeries自动发送SeriesChangeEvent给所有注册的收听者,例如, CategoryPlot。在此example,DynamicTimeSeriesCollection实施SeriesChangeEvent。在这种情况下,图表的XYPlot是已注册的监听器。

+0

当'JFreeChart'由'ChartFactory'创建(也就是说,我不需要自己注册一个)时,是否将'XYPlot'注册为缺省侦听'SeriesChangeEvent'的侦听器?你的回答在两天内帮了我两次。谢谢! – coolcfan 2011-12-29 08:11:43

+0

间接:['AbstractSeriesDataset'](http://www.jfree.org/jfreechart/api/javadoc/org/jfree/data/general/AbstractSeriesDataset.html)_forwards_系列更改为情节,它会(自动)侦听'数据集'变化。 – trashgod 2011-12-29 09:12:55

4

我有这个问题;我这样做使用这个:

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 
} 
+0

非常感谢,你帮我解决了问题 – 2014-01-21 14:35:13

+0

你有什么错误,但是很好的解决方案 1.-refreshChart( 2.-aChart初始化 – cmujica 2014-07-22 18:11:04

4

我也有这个问题与XYPlot。我发现了一个解决方法通过重新设置数据集:

chart.getXYPlot().setDataset(chart.getXYPlot().getDataset()); 

这是疯了,但它的工作原理...

注:chart.setNotify(true)似乎什么也不做。

0
// 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(); 
0

什么和我一起为以下几点:

//reset with new dataset 
chart().setDataset(dataset); 
repaint the ChartPanel that contains the JFreeChart 
chartPanel.repaint();