快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
ary;   }   else   {    barh = yAxis.getScale().getScreenCoordinate(ymin)-bary;   }   barw = barWidth; g.setColor(barColor);   g.fillRect(barx,bary,barw, barh);   g.setColor(Color.BLACK);   g.drawRect(barx,bary, barw, barh);  } }

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

时间:2010-09-13

BarPlot的实现比LinePlot稍微复杂一点。主要是要计算每个柱子的位置,宽度和高度。由于考虑到多组柱子以及柱子的值为负数时坐标不同,所以计算要繁索一点。但总体来说,实现BarPlot也是相当简单的。由于柱状图运行代码与折线图类似,这里就不列出演示代码。下面来看看程序在几种情况下的运行画面:

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

(单组数据的柱状图)

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

(多组数据的柱状图)

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

(有负值的柱状图)

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

时间:2010-09-13

现在我们有了画折线图的类LinePlot和画柱状图的类BarPlot。我们要生成一个折线图与柱状图组合起来的例子。还是来看看代码是如何实现的:

DataSeries ds = new DefaultDataSeries(Primary2ObjectUtil.Doulbe2Object(y1)); XAxis xaxis = new XAxis(new XScale(0,y1.length+1),ds.size()); YAxis yaxis = new YAxis(new YScale(10,15),4); xaxis.setDrawGrid(true); yaxis.setDrawGrid(true); LinePlot linePlot = new LinePlot(ds,xaxis,yaxis); BarPlot barPlot = new BarPlot(ds,xaxis,yaxis); /*先生成Bar Chart*/ Chart chart = new Chart(xaxis,yaxis,barPlot); /*然后将Line Plot加到Bar Chart中*/ chart.addPlot(linePlot);

代码中,我们先建立了一个Line Plot和一个Bar Plot,再生成了一个Bar Chart,然后再将Line Plot加到Bar Chart中。一个组合图表就简简单单的完成了。来看看:

实时绘图

实时绘图最常见的就是股票行情图了。我们不打算在此讲解如何实现这样的股票行情图。为了能说明问题,我们用一个线程定时产生一个数据,模拟实时绘图。

在此,我们对前面的图表组件进行扩展。这里我们用到了一个设计模式:Observer模式。使用Observer模式可使一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。所以在Observer中,关键的对象是被观察目标和观察者。一个观察目标可以有多个观察者。观察者必须事先注册给观察目录。这样当观察目录的状态发生改变时,观察者才有可能被通知到。

在我们的实时绘图结构中,DataSeries就是被观察目标,而Chart就是观察者。为此,我们设计了一个DataChangeListener接口作为观察者。我们重载了一个Chart来实现DataChangeListener。相应的,我们也重载了DataSeries类,提供注册观察者的机制。下面是它们的结构:

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

RealtimeChart对象事先用registerDataChangeListener方法注册给RealtimeDataSeries对象。当RealtimeDataSeries的数据发生改变时,将调用notifyListener方法通知所有已注册的DataChangeListener。Notify方法将依次调用每个已注册DataChangeListener对象的dataChanged方法。如下图:

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

在RealtimeChart中,实现了DataChangeListener接口的dataChanged方法:

public class RealtimeChart extends Chart implements DataChangeListener {  ……  /*实现DataChangeListener的方法*/  public void dataChanged()  { repaint();  } }

RealtimeChart的dataChanged方法在这里只需简单的重新绘制一次自己。绘制时将自动按新的数据来绘制。利用Observer模式,实时绘图就这样子简单的实现了。

借助实时绘图的例子,读者可以很容易的自行写一个连接到数据库或者说网络流的绘图程序,在此,我们就不作讲解了。

结束语

本文已较完整的讲解了一个可扩展的图表组件的构建过程。读者可以在此基础

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号