2013-05-14 28 views
1

假設我們需要在單個XYSeriesCollection中顯示多個XYSeries。我的問題是每次添加XYSeries時,JFreeChart都想更新圖表,並且會減慢顯示多個XYSeries的過程。在jFreeChart中一次顯示所有XYSeries以提高速度

我要的是與此類似:

// Do not update the chart 
XYSeriesCollection.add(XYSeries1) 
XYSeriesCollection.add(XYSeries2) 
... 
XYSeriesCollection.add(XYSeries10) 
// Update the chart 

我怎樣才能做到這一點?

回答

1

構造一個新XYSeriesCollection具有所需的系列,並在XYPlot調用setDataset()。這將生成一個DatasetChangeEvent

附錄:下面是更新Ñ串聯SSCCE,每個具有Ñ2值。由於這是一個性能問題,該示例在profiling中可能會有所幫助。

test image

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.util.Random; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import org.jfree.chart.*; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.data.time.Day; 
import org.jfree.data.time.TimeSeries; 
import org.jfree.data.time.TimeSeriesCollection; 
import org.jfree.data.xy.XYDataset; 

public class ChartPanelTest { 

    private static final int N = 16; 
    private static final Random random = new Random(); 

    private static XYDataset createDataset() { 
     TimeSeriesCollection tsc = new TimeSeriesCollection(); 
     for (int j = 0; j < N; j++) { 
      TimeSeries series = new TimeSeries("Data" + j); 
      Day current = new Day(); 
      for (int i = 0; i < N * N; i++) { 
       series.add(current, random.nextGaussian()); 
       current = (Day) current.next(); 
      } 
      tsc.addSeries(series); 
     } 
     return tsc; 
    } 

    private static JFreeChart createChart(final XYDataset dataset) { 
     JFreeChart chart = ChartFactory.createTimeSeriesChart(
      "Test", "Day", "Value", dataset, false, false, false); 
     return chart; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       XYDataset dataset = createDataset(); 
       JFreeChart chart = createChart(dataset); 
       final XYPlot plot = chart.getXYPlot(); 
       ChartPanel chartPanel = new ChartPanel(chart) { 
        @Override 
        public Dimension getPreferredSize() { 
         return new Dimension(600, 300); 
        } 
       }; 
       f.add(chartPanel); 
       JPanel p = new JPanel(); 
       p.add(new JButton(new AbstractAction("New") { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         plot.setDataset(createDataset()); 
        } 
       })); 
       f.add(p, BorderLayout.SOUTH); 
       f.pack(); 
       f.setLocationRelativeTo(null); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+0

感謝。你能不能請看看這個:http://stackoverflow.com/questions/16574733/how-to-make-jfreechart-displaying-the-tooltip-point-information-faster –

1

看着the documentation for XYSeriesCollection(假設add應該是addSeries)沒有方法addAll(或類似)。

如果您願意,您可以可以擴展XYSeriesCollection並執行addAll。在這種方法中,您可以在添加之前臨時禁用所有偵聽器,並在之後重新添加它們。然而,這可能是一個壞主意,並鐵定必須​​:

  • 它會產生不可預知的多態性行爲
  • 它需要反思的黑客,因爲AbstractDataset.listenerListprivate
  • 它可以生成一個安全異常
  • 它不會是線程安全的

那麼簡單的答案是沒有,它不可行


&hellip;但是這是你如何可以做一個出發點:

Field field = getClass().getDeclaredField("listenerList"); 
field.setAccessible(true); 
EventListenerList ell = field.get(this); 
// go from here 
field.setAccessible(false);