我创建了一个图表,如下所示,并且我正在向 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/