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心得笔记