快速业务通道

构建可扩展的Java图表组件 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
ss LinePlot extends Plot {  ……  public void draw(Graphics g, DataSeries ds, int index)  {   if ( ds == null ) return;   g.setColor(lineColor);   double[] x = new double[ds.size()];   double[] y = new double[ds.size()];   int[] xPoints = new int[ds.size()];   int[] yPoints = new int[ds.size()];   for ( int i = 0; i< ds.size(); i++ )   {    x[i] = ((Double)ds.getXData(i)).doubleValue();    y[i] = ((Double)ds.getYData(i)).doubleValue();    /*将ds中的实际值转换成屏幕坐标值*/    xPoints[i] = xAxis.getScale().getScreenCoordinate(x[i]);    yPoints[i] = yAxis.getScale().getScreenCoordinate(y[i]);   }   /*绘制折线*/   g.drawPolyline(xPoints, yPoints, xPoints.length);  } }

上面可出了LinePlot中绘制折线的代码,我们看到,绘制一个折线是多么的轻松和简单。

完成折线图

通过前面的实现代码,我们来看一个完整的折线图示例:

double[] y = new double[] { 12.5,14.1,13.2,11.4,13.25,12.32 };  try {   DataSeries ds = new DefaultDataSeries(Primary2ObjectUtil.Doulbe2Object(y));   XAxis xaxis = new XAxis(new XScale(0,y.length+1),ds.size());   YAxis yaxis = new YAxis(new YScale(10,15),4);   xaxis.setDrawGrid(true);   yaxis.setDrawGrid(true);   LinePlot plot = new LinePlot(ds,xaxis,yaxis);   Chart chart = new Chart(xaxis,yaxis,plot);   JFrame frame = new JFrame("Line Plot Demo");   frame.setSize(400,300);   frame.getContentPane().add(chart);   frame.setVisible(true);  }  catch (InvalidDataException e)  {   e.printStackTrace();  }

构建可扩展的Java图表组件(9)

时间:2010-09-13

下面是这个程序运行起来的屏幕截图:

构建可扩展的Java图表组件 - 编程入门网

(单组数据的折线图)

构建可扩展的Java图表组件 - 编程入门网

(有多组数据的折线图)

构建可扩展的Java图表组件(10)

时间:2010-09-13

扩展其它类型的图表

通过前面的例子,我们知道要实现特定类型的图表,只要实现特定的Plot类就可以了。如果数据有特殊格式,只需再扩展一个DataSeries就可以了。为使大家加深理解,我们再以一个柱状图为例子作讲解。

在第一节的图1-2和图1-3中,我们知道,一组数据除了用折线图表示之外,还可以表示成柱状图的形式。在这里我们就借用折线图的数据,来实现一个BarPlot。下面列出了BarPlot的关键代码:

public class BarPlot extends Plot {  ……  public void draw(Graphics g, DataSeries ds, int index)  {  if ( ds == null ) return;  /*每组柱子的个数*/  int bars = this.dataSeries.size();  /*出每个柱子应有的宽度*/  int barWidth = (int) ((double)xAxis.width/((double)ds.size()+1)/bars-barSpace);  if ( barWidth <=0 ) barWidth = 1;  int barx,bary,barw,barh;  int barGroupWidth = barWidth*bars;  double ymin = yAxis.getScale().getMin();  for ( int i = 0;i<ds.size(); i++ )  {   barx = (int)(xAxis.getScale().getScreenCoordinate(i+1) - barGroupWidth/2.0d) + index*barWidth;   double val = ((Double)ds.getYData(i)).doubleValue();   bary = yAxis.getScale().getScreenCoordinate(val);   if ( ymin<0) if ( val<0 )   {    barh = bary-yAxis.getScale().getScreenCoordinate(0);    bary = bary-barh;   }   else   {    barh = yAxis.getScale().getScreenCoordinate(0)-b

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号