2011-06-01 26 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();