posts - 1,  comments - 0,  trackbacks - 0

JFreeChart 是一个非常流行的一个免费开源的图表软件
已经有8年以上的历史

首先要下载jar包
www.jfree.org

在http://www.jfree.org/jfreechart 下点击Project Page at SourceForge 去下载
要下载JFreeChart 与JCommon

把jfreechart-1.0.9.jar与jcommon-1.0.12.jar加入到系统中

做JFreeChart的时候,一般是以下三步
1:要有数据 比如DefaultPieDataset
2:根据数据生成 JFreeChart 对象
3:显示JFreeChart对象(显示在swing中或生成一个图片在jsp中显示)


一:体验下JFreeChart的强大功能(读javadoc文档 一个最重要的类JFreeChart)
 package com.test.jfreechart
 public class JFreeChartTest{
 public static void main(String []args){
  //首先要有数据(Dataset数据集)
  DefaultPieDataset dpd=new DefaultPieDataset();
  //setValue(Comparable key ,double value);
  //字符串实现了Comparable接口
  dpd.setValue("管理人员",25);
  dpd.setValue("市场人员",25);
  dpd.setValue("开发人员",45);
  dpd.setValue("其他人员",10);
  //然后把数据放入到JFreeChart 中
  //创建一个平面图形
  JFreeChart chart=CharFactory.createPieChart("某公司人员组织结构图",dbp,true,false,false);
     //JFreeChart chart=CharFactory.createPieChart3D("某公司人员组织结构图",dbp,true,false,false);
  //通过swing显示出来
  ChartFrame frame=new ChartFrame("标题",chart);
  frame.pack();
  frame.setVisible(true);
 }
 }

  上面会显示一个饼状图,一般来说,图形有3部分组成
   1:标题
   2:中间的图形(叫plot)
   3:底部有个说明什么颜色表示什么数据(legend)
package com.test.jfreechart
//ApplicationFrame 是属于Jcommon中的
 public class JFreeChartTest2 extends ApplicationFrame{ 柱状图
 public JFreeChartTest2(String title)
 {
  super(title);

  this.setContentPane(createPanel());
 }

 public static CategoryDataset createDataset()
 {
  //默认柱状图数据集  Category(柱状)
  DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  //setValue(double value,Comparable rowKey,Comparable columnKey)
  dataset.setValue(10, "aa", "管理人员");
  dataset.setValue(20, "bb", "市场人员");
  dataset.setValue(40, "cc", "开发人员");
  dataset.setValue(15, "dd", "其他人员");

  return dataset;
 }

 //把数据加到chart 图表中
 public static JFreeChart createChart(CategoryDataset dataset)
 {
  JFreeChart chart = ChartFactory.createBarChart3D("hello", "人员分布", "人员数量",
    dataset, PlotOrientation.VERTICAL, true, false, false);

  chart.setTitle(new TextTitle("某公司组织结构图", new Font("宋体", Font.BOLD
    + Font.ITALIC, 20)));

  CategoryPlot plot = (CategoryPlot) chart.getPlot();

  CategoryAxis categoryAxis = plot.getDomainAxis();

  categoryAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));

  return chart;

 }
 public static JPanel createPanel()
 {
  JFreeChart chart = createChart(createDataset());

  return new ChartPanel(chart);
 }

 public static void main(String[] args)
 {
  JFreeChartTest2 chart = new JFreeChartTest2("某公司组织结构图");

  chart.pack();
  chart.setVisible(true);
 }
 
 }

二:上面都是在swing中生成的图形,我们在web程序里面怎么做呢
  下面把JFreeChart 生成一个图片,那么在web程序中就可以调用这个图片了
  public class JFreeChartTest3
{
 public static void main(String[] args) throws Exception
 {
  JFreeChart chart = ChartFactory.createPieChart("某公司组织结构图",
    getDataset(), true, false, false);

  chart.setTitle(new TextTitle("某公司组织结构图", new Font("宋体", Font.BOLD,22)));

  LegendTitle legend = chart.getLegend(0);

  legend.setItemFont(new Font("微软雅黑", Font.BOLD, 14));

  PiePlot plot = (PiePlot) chart.getPlot();

  plot.setLabelFont(new Font("隶书", Font.BOLD, 16));

  //通过输出流把图形 创建为一个图片
  OutputStream os = new FileOutputStream("company.jpeg");
  //将chart 输出到os中,宽为1000,高为800
  ChartUtilities.writeChartAsJPEG(os, chart, 1000, 800);

  os.close();

 }

 private static DefaultPieDataset getDataset()
 {
  DefaultPieDataset dpd = new DefaultPieDataset();

  dpd.setValue("管理人员", 25);
  dpd.setValue("市场人员", 25);
  dpd.setValue("开发人员", 45);
  dpd.setValue("其他人员", 10);

  return dpd;
 }

}

三:如何在jsp中显示JFreeChart生成的图片

org.jfree.chart.servlet.DisplayChart
这是一个servlet,这个Servlet会作为一个流把图片输出到客户端
要使用DisplayChart 那么在web.xml中必须配置如下代码
 <servlet>
  <servlet-name>DisplayChart</servlet-name>
  <servlet-class>
   org.jfree.chart.servlet.DisplayChart
  </servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>DisplayChart</servlet-name>
  <url-pattern>/DisplayChart</url-pattern>
 </servlet-mapping>

  <%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
   
<%@ page import="org.jfree.data.general.DefaultPieDataset,org.jfree.chart.ChartFactory
,org.jfree.chart.JFreeChart,org.jfree.chart.servlet.*" %>
   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>

<%

DefaultPieDataset dpd = new DefaultPieDataset();

dpd.setValue("管理人员", 25);
dpd.setValue("市场人员", 25);
dpd.setValue("开发人员", 45);
dpd.setValue("其他人员", 10);

JFreeChart chart = ChartFactory.createPieChart3D("某公司组织结构图",dpd, true, false, false);
//ServletUtilities 能帮助生成图片对象
String fileName = ServletUtilities.saveChartAsPNG(chart,800,600,session);

String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;

%>

<img src="<%= url %>" width="800" height="600">


</body>
</html>

四:要通过Struts2整合JFreeChart ,可以学到Struts2整合其他插件的通用方法
怎么通过Struts2整合JFreeChart
通过用户投票这个例子达到整合
select.jsp
<h1>请选择喜欢的运动项目</h1>
<s:form action="viewResult">
 <s:checkbox name="interest" label="足球"></s:checkbox>
 <s:checkbox name="interest" label="篮球"></s:checkbox>
 <s:checkbox name="interest" label="排球"></s:checkbox>
 <s:checkbox name="interest" label="羽毛球"></s:checkbox>
</s:form>
上面的方式,显示的时候所有的value都为true 这显然不行的。
不可能提交的表单都为true的,修改如下
<h1>请选择喜欢的运动项目</h1>
<s:form action="viewResult">
 <s:checkbox name="interest" label="足球" fieldValue="football"></s:checkbox>
 <s:checkbox name="interest" label="篮球" fieldValue="basktball"></s:checkbox>
 <s:checkbox name="interest" label="排球" fieldValue="volleytball"></s:checkbox>
 <s:checkbox name="interest" label="羽毛球" fieldValue="badminton"></s:checkbox>

  <!--<s:checkboxlist list="#{'computer':'计算机','math':'数学'}"> name="interest" label="阳光" labelPosition="top"></s:checkboxlist>
-->
 <s:submit value="提交"/>
</s:form>

<s:checkbox>与<s:checkboxlist>这2个标签都是复选框,推荐使用s:checkbox

//要把struts2-jfreechart-plugin.jar复制到系统中

ViewResult这个Action的作用就是
首先把复选框中的数据加入到interest这个List中
然后把这个数据放到chart这个对象中
然后把chart对象交给JFreechart-plugin插件显示输出


这个action执行的时候,会执行execute方法
返回SUCCESS
这是的结果类型为chart,那么jfreechart-plugin这个插件会自动
调用action中的getChart方法,并显示出来

package com.test.action;
public class ViewResultAction extends ActionSupport{
  private JFreeChart chart;//chart变量不能随便改的
  //chart的setters getters方法
  public JFreeChart getChart(){
 chart=ChartFactory.createBarChart("兴趣统计结果","项目","结果",getDataset(),PlotOrientation.VERTICAL,false,false,false);
 chart.setTitle(new TextTitle("兴趣统计结果",new Font("黑体",Font.BOLD,22)));
 CategoryPlot plot=(CategoryPlot)chart.getPlot();
 CategoryAxis axis=plot.getDomainAxis();//x坐标
 axis.setLabelFont(new Font("宋体",Font.BOLD,22));
 axis.setCategoryLabelPositionOffset(CategoryLabelPositions.UP_45);//字体的倾斜度
 
 return chart;
  }
  //获得表单数据
  private List<String> interest;//自动把复选框的值设置到List中
  //getters,setters方法
  public String execute() throws Exception{
 //从struts.apache.org中找到
 //jfreechart-plugin
        //jfreechart-plugin这个插件 能够把chart对象(自动调用getChart()方法)生成到客户端并能够显示
 //不会我们去写代码生成图片显示了 
 return SUCCESS;
  }

  //把list客户端的复选框的值保存到application中
  private void increaseResult(List<String> list){
 ActionContext context=ActionContext.getContext();
 Map map=context.getApplication();//获得application对象
 //application对象中保存投票的结果 模拟
 for(String str:list){
  if(null==map.get(str)){//第一次投票
  map.put(str,1);
   }
   else{//表示这个选项不是第一次投票
      map.put(str,(Integer)map.get(str)+1);
   }
 }
  }
  private CategoryDataset getDataset(){//产生柱状图的数据
 DefaultCategoryDataset dataset=new DefaultCategoryDataset();
 increaseResult(this.getInterest());//把数据更新到application中
 ActionContext context=ActionContext.getContext();
 Map map=context.getApplication();
 //把application中的数据放到dataset中
 dataset.setValue((Integer)map.get("football"),"","足球");
 dataset.setValue((Integer)map.get("basketball"),"","蓝球");
 dataset.setValue((Integer)map.get("volleyball"),"","排球");
 dataset.setValue((Integer)map.get("badminton"),"","羽毛球");
 return dataset;
  }
}
把jfreechart-plugin的jar包解压缩
修改struts-plugin.xml中
把<package name="jfreechart-default">
修改为
<package name="jfreechart-default" extends="struts-default">
然后把jfreechart-plugin的jar包重新打包
jar cvf struts2-jfreechart-plugin-版本号.jar  -C
生成后重新放到系统中

在struts.xml中进行配置
修改如下
<package name="struts2" extends="jfreechart-default">
<action name="viewResult" class="com.test.action.ViewResultAction">
   <result name="success" type="chart">
   <param name="height">600</param>
       <param name="width">800</param>
   </result>
</action>


这样 运行项目 就会显示结果了

posted on 2010-07-01 15:52 gjy 阅读(1333) 评论(0)  编辑  收藏 所属分类: ssh心得笔记

只有注册用户登录后才能发表评论。


网站导航: