Включение / отключение рисования JFreeChart - PullRequest
0 голосов
/ 12 апреля 2011

У меня есть диаграмма, созданная, как показано ниже, и я добавляю значения в 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);

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Другая возможность - установить c.setNotify(false);, что не позволит графику прослушивать ChartChangeEvent:

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

2 голосов
/ 12 апреля 2011

Я столкнулся с той же проблемой, когда API JFreechart довольно громоздкий и просто перерисовывает всю диаграмму всякий раз, когда добавляется одна точка данных, что приводит к большим издержкам рендеринга.

Я решил это такреализовать мою собственную базовую модель (например, 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;
    }
  }
}
...