package demo; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.RenderingHints; import java.io.PrintWriter; import javax.servlet.http.HttpSession; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartRenderingInfo; 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.axis.ValueAxis; import org.jfree.chart.entity.StandardEntityCollection; import org.jfree.chart.labels.CategoryItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.chart.renderer.category.CategoryItemRenderer; import org.jfree.chart.servlet.ServletUtilities; import org.jfree.chart.title.TextTitle; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; public class CategoryItemChart { public static String generateBarChart( HttpSession session, PrintWriter pw, int w, int h) { String filename = null; try { CategoryDataset dataset=createDataset(); JFreeChart chart=ChartFactory.createBarChart( "世界傻瓜大奖赛",//图表标题 "比赛场次",//X轴标题 "傻瓜程度",//Y轴标题 dataset,//数据集合 PlotOrientation.VERTICAL,//图表显示方向(水平、垂直) true,//是否使用图例 false,//是否使用工具提示 false//是否为图表增加URL ); /*------------配置图表属性--------------*/ // 1,设置整个图表背景颜色 chart.setBackgroundPaint(Color.yellow); /*------------设定Plot参数-------------*/ CategoryPlot plot=chart.getCategoryPlot(); // 2,设置详细图表的显示细节部分的背景颜色 plot.setBackgroundPaint(Color.PINK); // 3,设置垂直网格线颜色 plot.setDomainGridlinePaint(Color.black); //4,设置是否显示垂直网格线 plot.setDomainGridlinesVisible(true); //5,设置水平网格线颜色 plot.setRangeGridlinePaint(Color.yellow); //6,设置是否显示水平网格线 plot.setRangeGridlinesVisible(true); /*---------将所有数据转换为整数形式---------*/ final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); /*---------设置是否在柱图的状态条上显示边框----*/ CategoryItemRenderer renderer = (CategoryItemRenderer) plot.getRenderer(); BarRenderer render=(BarRenderer) plot.getRenderer(); render.setItemMargin(0.1); /*---------设置状态条颜色的深浅渐变-----------*/ GradientPaint gp0 = new GradientPaint( 0.0f, 0.0f, new Color(255,200,80), 0.0f, 0.0f, new Color(255,255,40) ); GradientPaint gp1 = new GradientPaint( 0.0f, 0.0f, new Color(50,255,50), 0.0f, 0.0f, new Color(100,255,100) ); GradientPaint gp2 = new GradientPaint( 0.0f, 0.0f, Color.red, 0.0f, 0.0f, new Color(255,100,100) ); GradientPaint gp3 = new GradientPaint( 0.0f, 0.0f, new Color(108,108,255), 0.0f, 0.0f, new Color(150, 150, 200) ); renderer.setSeriesPaint(0, gp0); renderer.setSeriesPaint(1, gp1); renderer.setSeriesPaint(2, gp2); renderer.setSeriesPaint(3, gp3); /* * * 解决柱状体与图片边框的间距问题 * * * */ /*------设置X轴标题的倾斜程度----*/ CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setCategoryLabelPositions( CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0) ); /*------设置柱状体与图片边框的左右间距--*/ domainAxis.setLowerMargin(0.01); domainAxis.setUpperMargin(0.01); /*------设置柱状体与图片边框的上下间距---*/ ValueAxis rAxis = plot.getRangeAxis(); rAxis.setUpperMargin(0.15); rAxis.setLowerMargin(0.15); /*---------设置每一组柱状体之间的间隔---------*/ render.setItemMargin(0.0); /* * * 解决柱状体与图片边框的间距问题 * * * */ /* * * * 解决JFREECHART的中文显示问题 * * * */ /*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/ chart.getRenderingHints().put( RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF ); /*----------设置标题字体--------------------------*/ TextTitle textTitle = chart.getTitle(); textTitle.setFont(new Font("黑体", Font.PLAIN, 20)); /*------设置X轴坐标上的文字-----------*/ domainAxis.setTickLabelFont(new Font("sans-serif",Font.PLAIN,11)); /*------设置X轴的标题文字------------*/ domainAxis.setLabelFont(new Font("宋体",Font.PLAIN,12)); /*------设置Y轴坐标上的文字-----------*/ rAxis.setTickLabelFont(new Font("sans-serif",Font.PLAIN,12)); /*------设置Y轴的标题文字------------*/ rAxis.setLabelFont(new Font("黑体",Font.PLAIN,12)); /*---------设置柱状体上的显示的字体---------*/ renderer.setItemLabelGenerator(new LabelGenerator(0.0)); renderer.setItemLabelFont(new Font("宋体",Font.PLAIN,12)); renderer.setItemLabelsVisible(true); /* * * * 解决JFREECHART的中文显示问题 * * * */ /*------得到chart的保存路径----*/ ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection()); filename = ServletUtilities.saveChartAsPNG(chart, w, h, info, session); /*------使用printWriter将文件写出----*/ ChartUtilities.writeImageMap(pw, filename, info,true); pw.flush(); } catch (Exception e) { System.out.println("Exception - " + e.toString()); e.printStackTrace(System.out); filename = "public_error_500x300.png"; } return filename; } /*-------------设置柱状体顶端的数据显示--------------*/ static class LabelGenerator implements CategoryItemLabelGenerator { private double threshold; public LabelGenerator(double threshold) { this.threshold = threshold; } public String generateLabel(CategoryDataset dataset, int row,int column) { String result = null; final Number value = dataset.getValue(row, column); if (value != null) { final double v = value.doubleValue(); if (v > this.threshold) { result = value.toString(); } } return result; } public String generateRowLabel(CategoryDataset dataset, int row){ return null; } public String generateColumnLabel(CategoryDataset dataset, int column){ return null; } } /*-----------数据集合封装-------------*/ private static CategoryDataset createDataset(){ String s1="笨笨"; String s2="蛋蛋"; String s3="傻傻"; String s4="瓜瓜"; String c1="第一场"; String c2="第二场"; String c3="第三场"; String c4="第四场"; String c5="第五场"; /*-------------封装图表使用的数据集-------------*/ DefaultCategoryDataset dataset=new DefaultCategoryDataset(); dataset.setValue(1.0,s1,c1); dataset.setValue(2.0,s1,c2); dataset.setValue(3.0,s1,c3); dataset.setValue(4.0,s1,c4); dataset.setValue(5.0,s1,c5); dataset.setValue(5.0,s2,c1); dataset.setValue(4.0,s2,c2); dataset.setValue(3.0,s2,c3); dataset.setValue(2.0,s2,c4); dataset.setValue(1.0,s2,c5); dataset.setValue(1.0,s3,c1); dataset.setValue(2.0,s3,c2); dataset.setValue(3.0,s3,c3); dataset.setValue(2.0,s3,c4); dataset.setValue(1.0,s3,c5); dataset.setValue(1.0,s4,c1); dataset.setValue(2.0,s4,c2); dataset.setValue(3.0,s4,c3); dataset.setValue(4.0,s4,c4); dataset.setValue(5.0,s4,c5); return dataset; } }
<%@ page contentType="text/html;charset=GBK"%> <%@ page import="demo.CategoryItemChart"%> <%@ page import="java.io.PrintWriter"%> <html> <head> <title> </title> <% //以下部分为图象输出 String fileName=CategoryItemChart.generateBarChart(session,new PrintWriter(out),580,250); String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName; %> </head> <body bgcolor="#ffffff"> <table width="580" border="0" cellspacing="0" cellpadding="0"> <tr> <td> <img src="<%= graphURL %>" width=580 height=250 border=0 > </td> </tr> </table> </body> </html>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <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>/servlet/DisplayChart</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
效果如附件: