jfreechart

建立基于WEB的BI图表http://www.diybl.com/ 2007-11-11  网络 点击:123  [ 评论 ]
-
-
文章搜索:
一般情况下,JFreeChart只能是基于applet的app,不过,这对客户端要求过高,那么有人就会想到,能转换成jpg或者png等图片格式吗?当然,这是最关键的就是ChartUtilities这个类,它就像一个JFreeChart想摆脱局限的桥梁,有了它,那就一切皆有可能(当然也不是万能的,就像钱一样)。

为此,我就对于我的上篇文章,做进一步的扩展。先看效果

再看源代码


/**//*
* author:hujinpu
*/
package com.hujinpu.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieToolTipGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.urls.CustomPieURLGenerator;
import org.jfree.data.general.DefaultPieDataset;

public class PieWithMap ...{
public static void main(String[] args) throws IOException ...{

// 第一步创建数据集
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("类别1", 125.3);
dataset.setValue("类别2", 52.7);
dataset.setValue("类别3", 10.6);
dataset.setValue("类别4", 85.96);
dataset.setValue("类别5", 43.2);

// 第二步创建一个JFreeChart对象
JFreeChart chart = ChartFactory.createPieChart("第一个饼图", dataset, true, // 是否有图注
true, // 是否有提示
false // 是否有URLS
);

ChartUtilities.saveChartAsJPEG(new File("firstPieChart.jpg"), chart, 300, 300);
// 根据不同类型的图表使用不同类,以下是针对饼图的操作
PrintWriter w = null;
FileOutputStream fos_jpg = null;
FileOutputStream fos_cri = null;
//这个是重点
ChartRenderingInfo info = new ChartRenderingInfo();

PiePlot plot = (PiePlot) chart.getPlot();
//构造一个Map用于指定具体类别的url
Map urls = new HashMap();
urls.put("类别1", "http://www.livahu.com");
urls.put("类别2", "http://www.google.com");
urls.put("类别3", "http://www.baidu.com");
urls.put("类别4", "http://www.163.com");
urls.put("类别5", "http://www.csdn.net");

CustomPieURLGenerator cpug = new CustomPieURLGenerator();

cpug.addURLs(urls);

plot.setURLGenerator(cpug);

// 设置工具提示
plot.setToolTipGenerator(new StandardPieToolTipGenerator());

fos_jpg = new FileOutputStream("firstPieChart.jpg");

//把pieChart图生成出来,写入到输出流生成图片,同时把图片的具体信息放入ChartRenderingInfo的一个实例为以后生成Map提供信息
ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 400, 300, info);
fos_cri = new FileOutputStream("firstPieChart.map");

w = new PrintWriter(fos_cri);
//使用info中的图像具体信息生成关于这个图像的类别热点,并把它写到输出流中生成map文件。
ChartUtilities.writeImageMap(w, "mymap", info, true);
w.flush();
}
}

大家会注意到,ChartUtilities类在其中起了一个最为重要的作用。

我创建了一个ChartRenderingInfo对象并在调用ChartUtilities的writeChartAsJPEG时作为最后一个参数传递进去。

调用该方法结束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象,再通过ChartUtilities的writeImageMap方法来将ChartRenderingInfo对象读取出来,写到map文件中去。

具体map文件如下


<map id="mymap" name="mymap">
<area shape="poly" coords="137,92,150,80,165,71,182,66,200,64,200,147,200,147" onMouseOver="return overlib(''类别5 = 43.2'');" onMouseOut="return nd();" href="http://www.csdn.net"/>
<area shape="poly" coords="153,216,140,205,129,191,121,175,117,158,116,140,120,123,126,107,137,92,200,147,200,147" onMouseOver="return overlib(''类别4 = 85.96'');" onMouseOut="return nd();" href="http://www.163.com"/>
<area shape="poly" coords="169,225,153,216,200,147,200,147" onMouseOver="return overlib(''类别3 = 10.6'');" onMouseOut="return nd();" href="http://www.baidu.com"/>
<area shape="poly" coords="251,213,232,224,211,230,190,230,169,225,200,147,200,147" onMouseOver="return overlib(''类别2 = 52.7'');" onMouseOut="return nd();" href="http://www.google.com"/>
<area shape="poly" coords="200,64,213,65,225,68,237,73,248,79,258,87,266,97,273,108,278,120,282,133,283,146,282,158,279,171,275,183,269,194,261,204,251,213,200,147,200,147" onMouseOver="return overlib(''类别1 = 125.3'', STICKY, MOUSEOFF);" onMouseOut="return nd();" href="http://blog.csdn.net/hujinpu"/>
</map>
这里还有必要说明是我用到了overlib中的overlib.js,overlib是一个开源js类库,这是官方网站,里面说得很详细,其实一般情况下,我们只要把overlib.js这个js复制到你的目录就行了
(也可以在本站看我写的overlib简明教程)

注意类别1,我玩子一个小小的trick哦!(这里由于没有上传overlib.js这个文件,可能看不到效果)
/**

* 类库

* 1、jfreechart-1.0.5.jar、jcommon-1.0.9.jar、gnujaxp.jar
* 2、jbcl.jar、dx.jar、beandt.jar 由JBuilder2006的lib下提供

*/

package org.jfree.demo;

import java.io.*;

import org.jfree.data.*;

import org.jfree.chart.*;

import org.jfree.chart.plot.*;

import org.jfree.data.category.*;

import java.awt.Color;

import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;

import java.awt.Font;

import org.jfree.chart.axis.AxisLocation;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.awt.Toolkit;

import java.awt.Dimension;

/**

* <p>Title: Java开发手册</p>

*

* <p>Description: 适合中高级使用者</p>

*

* <p>Copyright: Copyright (c) 2007</p>

*

* <p>Company: lingbrother</p>

*

* @author lingbrother

* @version 1.0

*/

public class BarChartDemo {

public BarChartDemo() {

super();

}

public static void main(String[] args) throws IOException{

CategoryDataset dataset = getDataSet();

JFreeChart chart = ChartFactory.createBarChart3D(

"招生信息总览", // 图表标题

"应报与实报对照", // 目录轴的显示标签

"人数", // 数值轴的显示标签

dataset, // 数据集

PlotOrientation.VERTICAL, // 图表方向:水平、垂直

true, // 是否显示图例(对于简单的柱状图必须是false)

true, // 是否生成工具

true // 是否生成URL链接

);

CategoryPlot plot = chart.getCategoryPlot();//获得图表区域对象

//设置图表的纵轴和横轴org.jfree.chart.axis.CategoryAxis

org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();

domainAxis.setLowerMargin(0.1);//设置距离图片左端距离此时为10%

domainAxis.setUpperMargin(0.1);//设置距离图片右端距离此时为百分之10

domainAxis.setCategoryLabelPositionOffset(10);//图表横轴与标签的距离(10像素)

domainAxis.setCategoryMargin(0.2);//横轴标签之间的距离20%

//domainAxis.setMaximumCategoryLabelLines(1);

//domainAxis.setMaximumCategoryLabelWidthRatio(0);

//设定柱子的属性

org.jfree.chart.axis.ValueAxis rangeAxis = plot.getRangeAxis();

rangeAxis.setUpperMargin(0.1);//设置最高的一个柱与图片顶端的距离(最高柱的10%)

//设置图表的颜色

org.jfree.chart.renderer.category.BarRenderer3D renderer;

renderer = new org.jfree.chart.renderer.category.BarRenderer3D();

renderer.setBaseOutlinePaint(Color.red);

renderer.setSeriesPaint(0, new Color(0, 255, 255));//计划柱子的颜色为青色

renderer.setSeriesOutlinePaint(0,Color.BLACK);//边框为黑色

renderer.setSeriesPaint(1, new Color(0, 255, 0));//实报柱子的颜色为绿色

renderer.setSeriesOutlinePaint(1,Color.red);//边框为红色

renderer.setItemMargin(0.1);//组内柱子间隔为组宽的10%

//显示每个柱的数值,并修改该数值的字体属性

renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());

renderer.setItemLabelFont(new Font("黑体",Font.BOLD,12));//12号黑体加粗

renderer.setItemLabelPaint(Color.black);//字体为黑色

renderer.setItemLabelsVisible(true);

plot.setRenderer(renderer);//使用我们设计的效果

//设置纵横坐标的显示位置

plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);//学校显示在下端(柱子竖直)或左侧(柱子水平)

plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); //人数显示在下端(柱子水平)或左侧(柱子竖直)

try {

File file = new File("c:/student.png");

ChartUtilities.saveChartAsPNG(file,chart,400,300);//把报表保存为文件

}catch (Exception e) {

String s = e.getLocalizedMessage();

s = e.getMessage();

s = e.toString();

}

//将生成的报表放到预览窗口中

final ChartFrame preview = new ChartFrame("招生信息",chart);

preview.addWindowListener(new WindowAdapter() {

public void windowClosing(final WindowEvent event) {

preview.dispose();

}

});

preview.pack();

//调整预览窗口的大小和位置,适合屏幕,并且居中

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

preview.setSize(screenSize.width,screenSize.height-50);//适合屏幕,50表示把工具栏要考虑在内

Dimension frameSize = preview.getSize();

if (frameSize.height > screenSize.height) {

frameSize.height = screenSize.height;

}

if (frameSize.width > screenSize.width) {

frameSize.width = screenSize.width;

}

preview.setLocation( (screenSize.width - frameSize.width) / 2,

(screenSize.height - frameSize.height-50) / 2);

//显示报表预览窗口

preview.setVisible(true);

}

/**

* 获取一个演示用的组合数据集对象

* @return

*/

private static CategoryDataset getDataSet() {

DefaultCategoryDataset dataset = new DefaultCategoryDataset();

dataset.addValue(200, "计划", "清华大学");

dataset.addValue(400, "实报", "清华大学");

dataset.addValue(100, "计划", "天津大学");

dataset.addValue(205, "实报", "天津大学");

dataset.addValue(200, "计划", "郑州大学");

dataset.addValue(285, "实报", "郑州大学");

return dataset;

}

}


进入讨论组讨论。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值