2011-12-18 67 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); 
}