http://blog.csdn.net/lt1983lt/article/details/5665085

import Java.awt.BorderLayout;
import java.awt.Color;
import java.util.Hashtable;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.Range;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.time.Minute;
import org.jfree.data.time.RegularTimePeriod;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.RefineryUtilities;

public class JslideJPanel extends JPanel implements ChangeListener {
 private ChartPanel chartpanel = null;

private JSlider sliderWest = null;

private JSlider sliderSouth = null;

private int maxval = 100;

private int minval = -maxval;

private int lastValueX = 0;

private int lastValueY = 0;

private NumberAxis numberaxis_Y = null;

private double topY = 0.0;

private double lowY = 0.0;

private double distanceY = 0.0;

private double xishuY = 0.0;

DateAxis dateaxis_X = null;

private double topX = 0.0;

private double lowX = 0.0;

private double distanceX = 0.0;

private double xishuX = 0.0;

@SuppressWarnings("unchecked")
 public JslideJPanel(ChartPanel chartpanel, boolean canZoom) {
  if (true) {
   this.setLayout(new BorderLayout());
   this.chartpanel = chartpanel;
   this.sliderSouth = new JSlider(JSlider.HORIZONTAL, minval, maxval,
     0);
   sliderSouth.setMaximum(maxval);
   sliderSouth.setMinimum(minval);
   sliderSouth.setPaintTicks(true);
   sliderSouth.setMajorTickSpacing(20);
   sliderSouth.setMinorTickSpacing(10);
   sliderSouth.setPaintLabels(true);
   sliderSouth.setPaintTrack(true);
   sliderSouth.setSnapToTicks(true);
   Hashtable table = new Hashtable();
   table.put(new Integer(minval), new JLabel("缩小"));
   table.put(new Integer(maxval), new JLabel("放大"));
   sliderSouth.setLabelTable(table);
   sliderSouth.addChangeListener(this);
   this.sliderWest = new JSlider(JSlider.VERTICAL, minval, maxval, 0);
   /*
    * setPaintTicks()方法是设置是否在JSlider加上刻度,若为true则下面两行才有作用。
    * 设置大刻度与小刻度之间的距离(setMajorTickSpacing()与setMinorTickSpacing()方法).例如若大刻度间距离为30,
    * 小刻度间距离为10,则表示2个大刻度间会有3个小刻度.
    * setSnapToTicks()方法表示一次移动一个小刻度,而不再是一次移动一个单位刻度
    */

sliderWest.setMaximum(maxval);
   sliderWest.setMinimum(minval);
   sliderWest.setPaintTicks(true);
   sliderWest.setMajorTickSpacing(20);
   sliderWest.setMinorTickSpacing(10);
   sliderWest.setPaintLabels(true);
   sliderWest.setPaintTrack(true);
   // sliderWest.setSnapToTicks(true);
   sliderWest.setLabelTable(table);
   sliderWest.addChangeListener(this);
   this.add(chartpanel, BorderLayout.CENTER);
   this.add(sliderSouth, BorderLayout.SOUTH);
   this.add(sliderWest, BorderLayout.WEST);
   // 得到一些初始的参数
   JFreeChart chart = chartpanel.getChart();
   XYPlot xyplot = chart.getXYPlot();
   // 处理Y轴
   numberaxis_Y = (NumberAxis) xyplot.getRangeAxis();
   topY = numberaxis_Y.getRange().getUpperBound();
   lowY = numberaxis_Y.getRange().getLowerBound();
   distanceY = (topY - lowY) / (2 * maxval);
   xishuY = (maxval - 1) / (double) maxval;
   // 这个是为了防止放大时setRange(n,n)这种情况的出现。

// 处理X轴
   dateaxis_X = (DateAxis) xyplot.getDomainAxis();
   // 最小范围是一天,得到的毫秒数是通过查询的日期+距离0点的毫秒数得到的
   topX = dateaxis_X.getRange().getUpperBound();
   lowX = dateaxis_X.getRange().getLowerBound();
   distanceX = (topX - lowX) / (2 * maxval);
   xishuX = (maxval - 1) / (double) maxval;

} else {
   this.setLayout(new BorderLayout());
   this.chartpanel = chartpanel;
   this.add(chartpanel, BorderLayout.CENTER);
  }

}

public ChartPanel getChartpanel() {
  return chartpanel;
 }

public void setChartpanel(ChartPanel chartpanel) {
  this.chartpanel = chartpanel;
 }

public void stateChanged(ChangeEvent e) {
  System.out.println(sliderSouth.getValue() + "::::::::::::::::::::"
    + sliderWest.getValue());

if (e.getSource() == sliderWest) {
   // 处理y轴的缩放
   int slideInt = sliderWest.getValue();
   double distanceHere = distanceY * slideInt;
   if (slideInt >= 0) {
    // 乘以一个系数是为了防止setRange(a,a)这样的情况发生
    numberaxis_Y.setRange(lowY + distanceHere, topY - xishuY
      * distanceHere);
   } else {
    numberaxis_Y.setRange(lowY + distanceHere, topY - distanceHere);
   }
  } else if (e.getSource() == sliderSouth) {
   // 处理X轴的缩放
   int slideInt = sliderSouth.getValue();
   double distanceHere = distanceX * slideInt;
   if (slideInt >= 0) {
    // 乘以一个系数是为了防止setRange(a,a)这样的情况发生
    dateaxis_X.setRange(lowX + distanceHere, topX - xishuX
      * distanceHere);
   } else {
    dateaxis_X.setRange(lowX + distanceHere, topX - distanceHere);
   }
  }

// DateAxis numberaxis_X = (DateAxis) xyplot.getDomainAxis();
  // //最小范围是一天,得到的毫秒数是通过查询的日期+距离0点的毫秒数得到的
  // System.out.println(numberaxis_X.getRange().getUpperBound()+":......."+(numberaxis_X.getRange().getUpperBound()%86400000)/3600000);
  // System.out.println(numberaxis_X.getRange().getLowerBound()+":......."+(numberaxis_X.getRange().getLowerBound()%86400000)/3600000);
  // // numberaxis_X.setRange(arg0, arg1)
  // 怎么区分四种操作
  // 1通过e.getSource() == sliderWest可以区分是哪边需要放大或者缩小
  // 2通过与前一个值的大小的比较,确定是放大还是缩小,通过值的比较确定放大缩小的次数
  // chartpanel.zoomInDomain(arg0, arg1);//domain是横坐标
  // if(e.getSource() == sliderWest)
  // {
  // chartpanel.zoomOutBoth(sliderSouth.getValue(),
  // sliderWest.getValue());
  // }else if(e.getSource() == sliderSouth){
  // chartpanel.zoomOutBoth(sliderSouth.getValue(),
  // sliderWest.getValue());
  // }

}

}

通过调节坐标进行jfree图的放大缩小的更多相关文章

  1. canvas上画出坐标集合,并标记新坐标,背景支持放大缩小拖动功能

    写在前面:项目需求,用户上传一个区位的平面图片,用户可以在图片上添加新的相机位置,并且展示之前已绑定的相机坐标位置,图片支持放大缩小&拖动的功能.新增坐标,页面展示相对canvas定位,保存时 ...

  2. 【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

    这是一个iOS项目雅黑深邃的K线的绘制. 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://git ...

  3. HYStockChart, 股票图(包括K线图、趋势图、成交量、滚动、放大缩小等)

    HYStockChart, 股票图(包括K线图.趋势图.成交量.滚动.放大缩小等) https://www.helplib.com/GitHub/article_127980git 地址 http:/ ...

  4. 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果

    首先呢,还是一贯作风,我们先来看看众多应用中的示例:(这种效果是很常见的,可以说应用的必须品.)                搜狐客户端                               ...

  5. Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

    首先推荐一下鸿洋大大的打造个性的图片预览与多点触控视频教程,这套教程教我们一步一步实现了多点触控实现对图片的平移和缩放的功能.这篇文章我将在鸿洋大大的基础之上做了一些扩展功能: 1.图片的惯性滑动 2 ...

  6. Android DIY之路 (一) 指定区域多图片合成 放大 缩小 镜像 旋转 等(转)

    惯例先看效果图 // 注意做类似这种模板功能时候 方位由后台数据提供,这里我们用假数据 4个点 或者xy 加区域来做示例 //一开始我们公司用的是透明盖住 操作图片 但发现 局限性较大.后来直接限定区 ...

  7. QT5 OpenGL (六, 键盘事件, 开关灯,放大缩小综合运用)

    概要 实例效果图 立体图放大图 立体图缩小图 不加矢量开灯图 不加矢量关灯图 加矢量关灯图1 加矢量关灯图2 部分代码展示 主要内容解析 QT键盘事件 立体图形的放大和缩小 上下左右键以及A键D争键控 ...

  8. 解决mxGraph放大/缩小在非IE浏览器下overlay图标位置不变化的问题

    首先要创建一个工具栏.并为工具栏中的放大.缩小button定义事件. <div id="toolbar" style="float:left;margin-top: ...

  9. WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用

    一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...

随机推荐

  1. 手机CPU知识扫盲:谈谈手机CPU架构与原理

    CPU是手机上面最复杂,最贵的Soc(芯片),担任的也是手机中大脑的位置,是手机跑分性能的决定性硬件.智能手机发展到今天,各大手机CPU厂商也从春秋战国逐渐到了现在四国鼎立的时代(高通,MTK,三星, ...

  2. 面向Internet的编程

    面向Internet的编程 1994年秋天我返回工作时,这个公司的景象已经完全改变.他们决定Oak语言——跨平台的.安全的.易传输的代码——时理想的面向Internet的语言.同时他们在制作名为Web ...

  3. python 爬虫2 Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. import url ...

  4. ios --也是在B页面的生命周期设置如下代码。方法一是直接关闭和激活侧滑手势,方法二则是B遵循协议UIGestureRecognizerDelegate,设置侧滑交互代理,重写手势方法。

    @property (weak, nonatomic) id<UIGestureRecognizerDelegate> restoreInteractivePopGestureDelega ...

  5. Scala之模式匹配(Patterns Matching)

    前言 首先.我们要在一開始强调一件非常重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中.这是Scala模式匹配之所以重要且实用的一个关键因素!我们会在文章的后半部分具 ...

  6. PID file found but no matching process was found. Stop aborted

    一般脚本部署时不会遇到这种情况,有时候自个手动处理会出现”PID file found but no matching process was found. Stop aborted”,根据意思就可以 ...

  7. jsx编译器 atom

    开始学习react es6 觉得没有合适的编译器.于是找到了个Atom. 官网 https://atom.io/ 下载安装. 双击运行即可完成安装. 安装后点击 file>setting> ...

  8. 巨蟒python全栈开发linux之centos6

    1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...

  9. Exponential Backoff

    f^x(f^y+f-m)+f-n =f^(x+y)+f^(f-m)+(f-n) <?php $exponent=0; w(80,3); function w($input,$base){ glo ...

  10. jquery拓展插件开发

    学习参考网址整理: http://blog.csdn.net/chenxi1025/article/details/52222327 http://www.cnblogs.com/ellisonDon ...