java - 启用/禁用 JFreeChart 的绘制

标签 java swing user-interface rendering 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;
    }
  }
}

关于java - 启用/禁用 JFreeChart 的绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5627976/

相关文章:

Android - 使 ExpandableListView 元素具有透明背景

python - 为 Visual Studio 2010 安装 Python 工具的问题

java - 如何使用 JPA 存储 Map<String, List<String>>

java - 如何将字符串拆分为重叠的字符对

java - Python 中的 PLSA 实现

java - Java 中的异常类组织

java - 为什么我的 Swing 应用程序窗口在应用程序退出时间歇性地不关闭?

java - 根据设置为 jLabel 的图标指定 jTextField 中所需的文本?

java - ActionListener 中预期的标识符

JAVAFX 如何更新 GUI 元素(节点)