【问题标题】:Enabling/Disabling drawing of a JFreeChart启用/禁用 JFreeChart 绘图
【发布时间】:2011-04-11 21:49:49
【问题描述】:

我创建了一个如下所示的图表,我正在向 TimeSeries 添加值(在我的程序中的不同位置)。 ChartPanel 实际上包含在 JTabbedPane 中,我不想重绘图表,除非它的选项卡正在显示。我有什么方法可以表明当新数据进入 TimeSeries 时不应发生渲染,除非该选项卡是当前显示的选项卡?我猜有一些调用表明数据已更新并且需要新的渲染,所以基本上我想拦截该调用并且如果选项卡未显示则不执行任何操作,如果选项卡正在显示则让调用通过显示,并在用户切换到该选项卡时手动调用一次。这不是在后台使用一个 ChartPanel 的主要问题,但我在不同的选项卡上有几个,它开始像讨厌的那样消耗 CPU 来不断更新 4-5 个图表。

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

    ChartPanel cp = new ChartPanel(c);

【问题讨论】:

    标签: java swing user-interface rendering jfreechart


    【解决方案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;
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      另一种可能是设置c.setNotify(false);,这将阻止图表收听ChartChangeEvent

      http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/JFreeChart.html#setNotify(boolean)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多