如何在网站中使用走势图(jfreechart)

来源:百度文库 编辑:神马文学网 时间:2024/06/13 11:01:41
生活中我们经常用到各种图表,走势图就是其中的一种,例如:股票走势图,产品价格走势图,某个网站访问量走势图――没错,现在网站中使用走势图也是越来越普遍了。因为网站本身是为了发布信息而存在的,图表也是信息的一种,所以假如你正在建设一个网站,而网站需要反映一些连续的信息的话,那么用走势图来显示则会显得更加形象和直观,比起简单的在表格中罗列数据要好多了。
一.类及相关方法的介绍
本文将介绍一个生成走势图的控件,并公布基于这个控件开发的javabean的源代码,采用这个javabean,你就可以将价格走势图生成jpg文件,只要在自己的网页里面调用它,便可以用来显示各种走势图,因为是java程序,所以本文源代码是跟平台无关的。
控件名称:JfreeChart
你可以到http://www.object-refinery.com/jfreechart/index.html 这个网址去下载它的zip文件。
JfreeChart介绍:JfreeChart是一个免费的图表程序,100%java程序,目前网上对他的使用和介绍特别少,而且大多是英文的,事实上他的用处却是很大的,他的类很多,能够生成咱们常用的许多图表,限于篇幅,不能一一介绍,这里只挑几个加以说明。
XYSeriesCollection 类:XY坐标搜集类,用来获得XY轴坐标
XYSeries 类:存放XY轴坐标
XYDataset 类:将存放的坐标转换为可用的数据
ChartFactory 类:图表工厂,根据参数生成图表及图表的样式,包含许多静态方法。
ChartUtilities类:图表工具类,它包含了将图表保存为jpg文件的静态方法
作为一般的考虑,事实上为了生成一个走势图,我们只需要知道xy轴的坐标即可,基本程序流程图可以这样来画:

就第一步而言,我们可以通过多种方法来获得,比如从数据库中或者从文件中读取,为了突出重点节省篇幅,本文就直接定义一个二维double数组;第二步是关键的一步,我特意写了一个javabean,也就是下面要讲的bean,这里面调用了Jfreechart中的类,实现第三步只需要一句话,所以我就不再罗嗦,程序里面会有说明。
二.实例及源代码
package testchart; import java.awt.Color; import java.awt.GradientPaint; import java.io.OutputStream; import java.io.IOException; import java.util.Date; import java.util.Calendar; import java.util.GregorianCalendar; import com.jrefinery.data.*; import com.jrefinery.date.*; import java.io.File; import com.jrefinery.chart.*; import com.jrefinery.data.*; /** *

走势图生成程序

*

Description:本走势图生成程序可以生成二维坐标的走势曲线图

* @author 于秉超 * @version 1.0 */ public class CreatPriceChart { public CreatPriceChart(double[][] XYData,int width,int height,String filename) { this.setXYData(XYData); this.setWidth(width); this.setHeight(height); this.setFilename(filename); } /** * 将走势图保存为JPG文件 * @throws IOException */ public void saveChart()throws IOException{ File file = new File(filename) ; //将走势图保存为文件 ChartUtilities.saveChartAsJPEG(file, createChart(), width, height); } /** * 将XYData数组的数据转换为程序识别的坐标数据 * @return * @throws SQLException * @throws Exception */ public XYSeriesCollection createXYSeriesCollection() throws java.sql.SQLException ,Exception{ //声明坐标搜集类 XYSeriesCollection collection = new XYSeriesCollection(); //声明保存坐标类 XYSeries t1 = new XYSeries(""); try { //将坐标添加到类中 for(int j=0;j然后你可以生成一个应用类来调用上面这个javabean。为了迅速看到结果,我们可以预先初始化两个数组,然后把这两个数组赋值给相应的方法。在实际应用中,我们更有可能先将数据从数据库中读出来,然后再付给数组。我们生成的图片如下图所示:

package testchart; import java.awt.*; import java.awt.event.*; import javax.swing.*; import testchart.CreatPriceChart; public class Frame1 extends JFrame { JPanel contentPane; BorderLayout borderLayout1 = new BorderLayout(); //Construct the frame public Frame1() { enableEvents(AWTEvent.WINDOW_EVENT_MASK); try { jbInit(); testCreatXYChart();//调用生成图表类 } catch(Exception e) { e.printStackTrace(); } } //Component initialization private void jbInit() throws Exception { //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Your Icon]"))); contentPane = (JPanel) this.getContentPane(); contentPane.setLayout(borderLayout1); this.setSize(new Dimension(400, 300)); this.setTitle("Frame Title"); } //关窗口事件 protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } } public static void main(String[] args) { new Frame1().show(); } //测试图表生成类 void testCreatXYChart(){ //XY轴坐标值 double XYData[][]={{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, {800,810,780,640,645,700,720,630,600,550,500,480,300,200,187} }; CreatPriceChart cpc=new CreatPriceChart(XYData,540,300,"c:\\try.jpg"); try{ cpc.saveChart(); }catch(Exception e){ System.out.println(e); } } //显示生成的图表 public void paint(Graphics g){ Image img=Toolkit.getDefaultToolkit().getImage("c:\\try.jpg"); g.drawImage(img,10,10,img.getWidth(this),img.getHeight(this),Color.red,this); } //消除闪烁 public void update(Graphics g){ paint(g); } }
三.小结及应用展望
现在,我们基本了解了如何使用图表生成类,稍加改进,就可以作成一个功能强大的图表生成程序。例如,我们可能遇到这样的需求,假如我们在数据库中保存了大量的每日价格信息数据,现在需要把数据库的近30日的数据作成走势图显示。我们有两种方案。
第一:采用如下流程

在这个流程里面,图片是根据用户访问需要动态生成的。
还有一种方法:

这个流程最好的方式是将图片每日自动生成存放在硬盘上。
两种方法各有优劣,第一种不占用硬盘的空间,而且编写程序更为简单一些,但是显示速度比较慢,因为要进行数据库查询,尤其当数据量很大的时候,对于服务器压力也很大;第二耗费了硬盘的空间,但是用户访问速度较快,对于数据量大,访问流量较大的网站,我们建议采用第二种方式,以空间换时间。