用最简单的方式整合JFreechart和Structs并修改背景色

      JFreeChart是何物?熟悉java web 编程的朋友们不会陌生,它是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。

      现在让我们用最简单的方式把JFreechart和流行框架Structs整合起来吧。

第一步,导入所需要的包:

jcommon-1.0.16.jar,jfreechart-1.0.13.jar,struts2-jfreechart-plugin-2.1.6.jar

如果包没导好的话,后面的页面中<package name="QQ" extends="jfreechart-default">会报错的~


第二步,新建页面:

  新建一个页面,其中显示包含有JFreechart生成的图:

<%@ page language="java" contentType="text/html; charset=GB18030"
	pageEncoding="GB18030"%>
<%@page import="java.util.Date"%>
<%@page import="com.softeem.action.QQ_Count_Action"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!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>网络日志管理</title>
	</head>
	<body>

		<span>饼状图</span>
		<table>
			<tr>
				<td>
					<img alt="jfreechart" src="jfreechart!execute_exe" />
				</td>
				<td>
					<img alt="jfreechart1" src="jfreechart1.action" />
				</td>
			</tr>
		</table>
		<span>柱状图</span>
		<table>
		   <tr>
		     <td>
		     <img alt="jfreechart2" src="jfreechart!execute_exe1" />
		     </td>
		     <td>
		     
		     <img alt="jfreechart3" src="jfreechart!execute_exe2" />
		     </td>
		   </tr>
		</table>
		<span>拆线图</span>
	    <table>
	      <tr>
	        <td>
	         <img alt="jfreechart4" src="jfreechart!execute_exe3"/>
	        </td>
	        <td>
	        </td>
	      </tr>
	    </table>
		
	</body>
</html>
      
                         
第三步,配置structs.xml

   由于我们需要把JFreechart和structs整合,所以需要在structs.xml中配置action。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <!-- 允许使用静态方法 -->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
    <!-- 中文问题 -->
    <constant name="struts.i18n.encoding" value="gbk" />
    <package name="QQ" extends="jfreechart-default">
        <action name="jfreechart" class="com.softeem.action.JfreeCharAction"> <!-- 配置页面中使用的action -->
            <result name="success" type="chart">
                <param name="width">600</param>          <!-- 设置生成的图片大小 -->
                <param name="height">400</param>
            </result>
        </action>
        <action name="jfreechart1" class="com.softeem.action.QQ_Count_Action">
            <result name="success" type="chart">
                <param name="width">600</param>
                <param name="height">400</param>
            </result>
        </action>
        <action name="jfreechart2" class="com.softeem.action.JfreeCharAction">
            <result name="success" type="chart">
                <param name="width">600</param>
                <param name="height">400</param>
            </result>
        </action>
        <action name="jfreechart3" class="com.softeem.action.JfreeCharAction">
            <result name="success" type="chart">
                <param name="width">600</param>
                <param name="height">400</param>
            </result>
        </action>
                <action name="jfreechart4" class="com.softeem.action.JfreeCharAction">
            <result name="success" type="chart">
                <param name="width">600</param>
                <param name="height">400</param>
            </result>
        </action>
    </package>
</struts>


第四步,新建action

  我们需要根据刚刚structs.xml中配置的class名字来新建action,并在其中完成生成jfreechart图表的功能。

package jfreeChart;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
public class JfreeChartTest {

	public static JFreeChart createChart() throws IOException {
		// 数据集
		DefaultPieDataset dpd = new DefaultPieDataset();
		dpd.setValue("QQ", 25);
		dpd.setValue("MSN", 25);
		dpd.setValue("飞信", 45);
		dpd.setValue("其它", 10);
		// 创建PieChart对象
		JFreeChart chart = ChartFactory.createPieChart3D("海蜘蛛上网情况", dpd, true,
				true, false);
		utils.setFont(chart);
		return chart;

	}

	public static JFreeChart createZhuChart() throws IOException {
		JFreeChart chart = ChartFactory.createBarChart3D("图书销量统计图", // 图表标题
				"图书", // 目录轴的显示标签
				"销量", // 数值轴的显示标签
				getDataSet(), // 数据集
				// PlotOrientation.HORIZONTAL , // 图表方向:水平
				PlotOrientation.VERTICAL, // 图表方向:垂直
				false, // 是否显示图例(对于简单的柱状图必须是false)
				false, // 是否生成工具
				false // 是否生成URL链接
				);

		// 重新设置图标标题,改变字体
		chart
				.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC,
						22)));
		CategoryPlot plot = (CategoryPlot) chart.getPlot();
		// 取得横轴
		CategoryAxis categoryAxis = plot.getDomainAxis();
		// 设置横轴显示标签的字体
		categoryAxis.setLabelFont(new Font("宋体", Font.BOLD, 22));
		// 分类标签以45度角倾斜
		categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
		categoryAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 18));
		// 取得纵轴
		NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
		// 设置纵轴显示标签的字体
		numberAxis.setLabelFont(new Font("宋体", Font.BOLD, 22));
		FileOutputStream fos = null;
		fos = new FileOutputStream("book.jpg");
		// 将统计图标输出成JPG文件
		ChartUtilities.writeChartAsJPEG(fos, // 输出到哪个输出流
				1, // JPEG图片的质量,0~1之间
				chart, // 统计图标对象
				800, // 宽
				600,// 宽
				null // ChartRenderingInfo 信息
				);
		fos.close();
		return chart;

	}
	private static CategoryDataset getDataSet() {//为生成chart的方法提供数据
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(47000, "", "Spring2.0宝典");
		dataset.addValue(38000, "", "轻量级J2EE企业实战");
		dataset.addValue(31000, "", "基于J2EE的Ajax宝典");
		dataset.addValue(29000, "", "JavaScript权威指南");
		dataset.addValue(25000, "", "Ajax In Action");
		return dataset;
	}
	
	public static JFreeChart createZhuChart1() throws IOException {//生成chart对象,用于自动绘制图表
		JFreeChart chart = ChartFactory.createBarChart3D( 
				"图书销量统计图", // 图表标题 
				"图书", // 目录轴的显示标签 
				"销量", // 数值轴的显示标签 
				getDataSet1(), // 数据集 
				//PlotOrientation.HORIZONTAL , // 图表方向:水平 
				PlotOrientation.VERTICAL , // 图表方向:垂直 
				true, // 是否显示图例(对于简单的柱状图必须是false) 
				false, // 是否生成工具 
				false // 是否生成URL链接 
				); 
				//重新设置图标标题,改变字体 
				chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22))); 
				//取得统计图标的第一个图例 
				LegendTitle legend = chart.getLegend(0); 
				//修改图例的字体 
				legend.setItemFont(new Font("宋体", Font.BOLD, 14)); 
				CategoryPlot plot = (CategoryPlot)chart.getPlot(); 
				//取得横轴 
				CategoryAxis categoryAxis = plot.getDomainAxis(); 
				//设置横轴显示标签的字体 
				categoryAxis.setLabelFont(new Font("宋体" , Font.BOLD , 22)); 
				//分类标签以45度角倾斜 
				categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); 
				categoryAxis.setTickLabelFont(new Font("宋体" , Font.BOLD , 18)); 
				//取得纵轴 
				NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis(); 
				//设置纵轴显示标签的字体 
				numberAxis.setLabelFont(new Font("宋体" , Font.BOLD , 22)); 
				FileOutputStream fos = null; 
				fos = new FileOutputStream("book.jpg"); 
				//将统计图标输出成JPG文件 
				ChartUtilities.writeChartAsJPEG( 
				fos, //输出到哪个输出流 
				1, //JPEG图片的质量,0~1之间 
				chart, //统计图标对象 
				800, //宽 
				600,//宽 
				null //ChartRenderingInfo 信息 
				); 
				fos.close(); 
				return chart;

	}
	//返回一个CategoryDataset实例 
	private static CategoryDataset getDataSet1() 
	{ 
	DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
	dataset.addValue(45000 , "北京" , "Spring2.0宝典"); 
	dataset.addValue(38000 , "北京" , "轻量级J2EE企业实战"); 
	dataset.addValue(24000 , "北京" , "基于J2EE的Ajax宝典"); 
	dataset.addValue(32000 , "北京" , "JavaScript权威指南"); 
	dataset.addValue(21000 , "北京" , "Ajax In Action"); 
	dataset.addValue(37000 , "上海" , "Spring2.0宝典"); 
	dataset.addValue(36000 , "上海" , "轻量级J2EE企业实战"); 
	dataset.addValue(34000 , "上海" , "基于J2EE的Ajax宝典"); 
	dataset.addValue(42000 , "上海" , "JavaScript权威指南"); 
	dataset.addValue(12000 , "上海" , "Ajax In Action"); 
	dataset.addValue(42000 , "广州" , "Spring2.0宝典"); 
	dataset.addValue(40000 , "广州" , "轻量级J2EE企业实战"); 
	dataset.addValue(34000 , "广州" , "基于J2EE的Ajax宝典"); 
	dataset.addValue(18000 , "广州" , "JavaScript权威指南"); 
	dataset.addValue(26000 , "广州" , "Ajax In Action"); 
	return dataset; 
	} 
	
	/**
	 * 获取折线图表
	 */
	public static JFreeChart createLineChart(){//生成折线图的方法
		CategoryDataset dataset = getBarDataset();
		JFreeChart lineChart = ChartFactory.createLineChart("水果产量图", 
																"水果",
																"产量", 
																dataset, 
																PlotOrientation.VERTICAL, 
																true, 
																true, 
																false);
		lineChart.getTitle().setFont(new Font("华文新魏",Font.BOLD,32));
		
		Font font = new Font("黑体",Font.BOLD,15);
		lineChart.getLegend().setItemFont(font);    //设置引用标签的字体
		
		CategoryPlot linePlot = lineChart.getCategoryPlot();   //获取图表
		
		//设置网格的颜色(纵向和横向网格线条颜色以及可见性)
		linePlot.setBackgroundPaint(Color.LIGHT_GRAY);
		linePlot.setRangeGridlinesVisible(true);    //设置横向网格的可见性
		linePlot.setRangeGridlinePaint(Color.black);
		linePlot.setDomainGridlinesVisible(true);   //设置纵向网格的可见性
		linePlot.setDomainGridlinePaint(Color.black);
		
		CategoryAxis categoryAxis = linePlot.getDomainAxis();  //目录轴(即横坐标)
		categoryAxis.setLabelPaint(Color.blue);
		categoryAxis.setLabelFont(font);       //设置目录轴上的标签字体
		categoryAxis.setTickLabelFont(font);   //设置目录轴上标记字体
		
		org.jfree.chart.axis.ValueAxis valueAxis = linePlot.getRangeAxis();   //数值轴(即纵坐标)
		valueAxis.setAutoRange(false);  //数值轴不自动设置数值
		valueAxis.setAutoRangeMinimumSize(30);   //自动设置数据轴数据范围时数据范围的最小跨度
		valueAxis.setUpperBound(300); 	//数值轴的最大值为300
		valueAxis.setLowerBound(60);  //数值轴最小值为60
		valueAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); //数值轴显示整数
		valueAxis.setLabelFont(font);
		
		org.jfree.chart.renderer.category.LineAndShapeRenderer renderer = (org.jfree.chart.renderer.category.LineAndShapeRenderer)linePlot.getRenderer();//获取线条
		renderer.setShapesVisible(true);   //设置连接点是否显示
		float aa[] = {5.0f};
		BasicStroke realLine = new BasicStroke(1.8f);   //实线
		BasicStroke dashLine = new BasicStroke(2.2f,     //虚线
				BasicStroke.CAP_ROUND,   //端点风格
				BasicStroke.JOIN_ROUND,  //连接点风格
				8f,
				aa,
				0.6f);
		for(int i = 0,length = dataset.getColumnCount();i<length;i++){
			if(i%2==0){
				renderer.setSeriesStroke(i,dashLine);
			}else{
				renderer.setSeriesStroke(i,realLine);
			}
		}
		
		return lineChart;
	}
	private static CategoryDataset getBarDataset(){
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(110, "北京","苹果");
		dataset.addValue(150, "上海","苹果");
		dataset.addValue(140, "广州","苹果");
		
		dataset.addValue(120, "北京","荔枝");
		dataset.addValue(150, "上海","荔枝");
		dataset.addValue(130, "广州","荔枝");
		
		dataset.addValue(90, "北京","香蕉");
		dataset.addValue(160, "上海","香蕉");
		dataset.addValue(200, "广州","香蕉");
		
		dataset.addValue(210, "北京","橘子");
		dataset.addValue(140, "上海","橘子");
		dataset.addValue(180, "广州","橘子");
		
		dataset.addValue(100, "北京","菠萝");
		dataset.addValue(150, "上海","菠萝");
		dataset.addValue(120, "广州","菠萝");
		return dataset;
	}


}




/**
 * 设置字体
 * 
 * @author zyong
 * 
 */
class utils {
	public static void setFont(JFreeChart chart) {
		Font font = new Font("宋体", Font.ITALIC, 12);
		PiePlot plot = (PiePlot) chart.getPlot();
		chart.getTitle().setFont(font);
		plot.setLabelFont(font);
		chart.getLegend().setItemFont(font);
	}
}

第五步,改变背景颜色

    由于我的web页面的背景是黑色,JFreechart默认的背景颜色为白色,十分刺眼,顾我琢磨了一下把它的背景颜色改了,在此和大家分享一下。

// 设置总的背景颜色,这是最底层背景的颜色
chart.setBackgroundPaint(ChartColor.WHITE);
// 设置标题颜色
chart.getTitle().setPaint(ChartColor.blue);
// 获得图表对象
CategoryPlot p = chart.getCategoryPlot();
// 设置图的背景颜色,这是出于第二层的背景颜色,也就是图像周围边框的颜色
p.setBackgroundPaint(ChartColor.WHITE);
// 设置表格线颜色
p.setRangeGridlinePaint(ChartColor.red);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值