簡體   English   中英

啟用/禁用JFreeChart的圖形

[英]Enabling/Disabling drawing of a JFreeChart

我創建了一個如下圖所示的圖表,並將值添加到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);

我曾經遇到過同樣的問題,即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;
    }
  }
}

另一種可能性是設置c.setNotify(false); ,這將阻止圖表偵聽ChartChangeEvent

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM