2011-12-18 92 views
0

我正在使用JFreeChart在我的應用程序中創建時間序列圖表。
我設置它的域軸範圍手動使用:在jfreechart中縮小後恢復手動域軸範圍

... 
    plot.getDomainAxis().setAutoRange(false); 
    Calendar c1=Calendar.getInstance(); 
    c1.set(Calendar.HOUR_OF_DAY, 10); 
    c1.set(Calendar.MINUTE, 0); 
    Calendar c2=Calendar.getInstance(); 
    c2.set(Calendar.HOUR_OF_DAY, 18); 
    c2.set(Calendar.MINUTE, 0); 
    plot.getDomainAxis().setRange(c1.getTimeInMillis(),c2.getTimeInMillis()); 
    ... 

拉近到圖表,然後縮小在兩個軸,使得域軸範圍變化到一系列邊界和觸發AutoRange(上chartplot本身使用鼠標)不是我自己的手動怒火。

實施例(看域軸的範圍):
在出縮放之前(正確):
enter image description here

在出(不正確的 - 是自動範圍)縮放後:
enter image description here

如何讓它縮小到我手動設置的範圍?

感謝

+0

請提供一個[sscce](http://sscce.org/),展示您描述的問題。 – trashgod 2011-12-19 00:47:33

+0

嗨,它編輯它,並試圖使其SSCCE。 – RYN 2011-12-19 06:14:31

回答

2

你可以嘗試restoreAutoBounds(),顯示here,其次是你的自定義域設置。

附錄:您看到的行爲在ChartPanel的鼠標偵聽器實現中定義。您可以覆蓋chartProgress()並在圖表完成繪製並且不縮放時恢復您的域軸。

+0

但是,這需要自定義範圍'AutoRange'! – RYN 2011-12-18 19:11:06

+0

我試圖詳細闡述上述內容,但是您仍然沒有包含您的[sscce](http://sscce.org/)。 – trashgod 2011-12-19 07:18:46

0

這裏的解決方案:

class MyNumberAxis extends org.jfree.chart.axis.NumberAxis 
{ 
    private boolean m_RestoreDefaultAutoRange; 

    MyNumberAxis() 
    { 
     super(); 
    } 

    MyNumberAxis(String label) 
    { 
     super(label); 
    } 

    MyNumberAxis(String label, boolean restoreDefaulAutoRange) 
    { 
     super(label); 
     m_RestoreDefaultAutoRange = restoreDefaulAutoRange; 
    } 

    @Override 
    protected void autoAdjustRange() 
    { 
     if(m_RestoreDefaultAutoRange) 
     { 
      Plot plot = getPlot(); 
      if(plot != null && plot instanceof ValueAxisPlot) 
      { 
       Range r = getDefaultAutoRange(); 
       setRange(r, false, false); 
      } 
     } 
     else 
      super.autoAdjustRange(); 
    } 
} 

創建MyNumberAxis的實例設置布爾爲true,並在你的陰謀(plot.setRangeAxis()方法)使用它。如果您希望表現得像默認的NumberAxis,則將false傳遞爲布爾值。

0

上面的Magallo解決方案效果很好。我發現它更加有用,如果我添加另一個構造函數:

MyNumberAxis(String label, boolean restoreDefaulAutoRange, Range defaultRange) { 
    super(label); 
    m_RestoreDefaultAutoRange = restoreDefaulAutoRange; 
    setDefaultAutoRange(defaultRange); 
}