2011-04-11 39 views
0

我有一个图表,如下所示,我将值添加到TimeSeries(在我的程序中的不同位置)。 ChartPanel实际上包含在一个JTabbedPane中,我不想重绘图表,除非它的选项卡正在显示。除非该选项卡是当前显示的选项卡,否则当有新数据进入TimeSeries时,是否有任何方式可以表示不应该发生渲染?我猜是有一些调用信号表示数据已经更新,需要一个新的渲染,所以基本上我想拦截该调用,如果该选项卡没有显示,则不执行任何操作,如果该选项卡正在调用显示,并在用户切换到该选项卡时手动调用一次。这对于后台的一个ChartPanel来说并不是什么大问题,但是我有一些不同的选项卡,它开始吃像讨厌的CPU来不断更新4-5个图表。启用/禁用绘制JFreeChart

sAccuracy = new TimeSeries("a"); 
    TimeSeriesCollection dataset = new TimeSeriesCollection(sAccuracy); 
    JFreeChart c = ChartFactory.createTimeSeriesChart("Accuracy", 
      "", "Percent", dataset, false, false, false); 

    ChartPanel cp = new ChartPanel(c); 

回答

1

我已经面临同样的问题,由此JFreeChart的API是相当笨重,简单地重画每当加入一个单一的数据点产生大的渲染开销整个图表。

我已经解决了这个问题的方法是实现自己的底层模型(如XYDataset实现)是意识到正在显示包含它的图表时,并只有当该图表可见传播事件 - 如果图表是不可见的,那么模型应该推迟事件的发生,直到后来;例如

public class MyXYDataset extends AbstractXYDataset { 
    private boolean shown; 
    private boolean pendingEvent; 

    /** 
    * Called when the chart containing this dataset is being displayed 
    * (e.g. hook this into a selection listener that listens to tab selection events). 
    */ 
    public void setShown(boolean shown) { 
    this.shown = shown; 

    if (this.shown && this.pendingEvent) { 
     this.pendingEvent = false; 
     fireDatasetChanged(); 
    } 
    } 

    public void addDatapoint(double x, double y) { 
    // TODO: Add to underlying collection. 

    if (this.shown) { 
     // Chart is currently displayed so propagate event immediately. 
     fireDatasetChanged(); 
    } else { 
     // Chart is hidden so delay firing of event but record that we need to fire one. 
     this.pendingEvent = true; 
    } 
    } 
}