[英]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.