JSP 笔记 —— JFreeChart 基础学习

来源:互联网 发布:pc软件 编辑:程序博客网 时间:2024/05/22 00:12

一、关于JFreeChart

JFreeChart 是开源站点SourceForge.net 上的一个开源的Java 项目,是用java 写的图形报表组件,其主页为 http://www.jfree.org/jfreechart

下载zip 包解压后与lib 目录同级有个demo.jar,通过命令行运行该文件即可阅览各个报表demo。zip 包中包含源代码。

使用lib 中的jfreechart-versionNumber.jar 与jcommon-versionNumber.jar 即可完成通常的报表任务。



二、JFreeChart 核心对象


制图对象 JFreeChart 类:

基础构造方法:

public JFreeChart(String title, Font titleFont, Plot plot,boolean createLegend);//其中plot 不能为null
常用实例方法:

//添加与清除标题addLegend(LegendTitle legend);//添加图例标题addSubtitle(int index, Title subtitle);//实际上是按标题添加的先后顺序,修改索引为index的标题addSubtitle(Title subtitle);remove(Title subtitle);clearSubtitles();//返回图像createBufferedImage(int width, int height);//绘制draw(Graphics2D g2, Rectangle2D chartArea, Point2D anchor, ChartRenderingInfo info);//设置背景、透明度、对齐方式,及对应getter方法setBackgroundImage(Image image);setBackgroundImageAlpha(float alpha);setBackgroundImageAlignment(int alignment;//alignment取1(上)、2(下)、4(左)、8(右)、0(中)等。4上下取5、6;8上下取9、10。//获取Plot 对象getCategoryPlot();getPlot();


制图工厂对象 ChartFactory 类:

直接实例化JFreeChart 类,需要设置的参数较多,常用的是使用ChartFactory 获得JFreeChart 对象。该类是抽象类,提供许多静态方法获取JFreeChart 对象.

常用几种图及对应部分方法:

//区域类型图,最基础类方法:createAreaChart(String title,            String categoryAxisLabel, String valueAxisLabel,            CategoryDataset dataset, PlotOrientation orientation,            boolean legend, boolean tooltips, boolean urls)//柱状类型图,最基础方法:JFreeChart createBarChart(String title,            String categoryAxisLabel, String valueAxisLabel,            CategoryDataset dataset, PlotOrientation orientation,            boolean legend, boolean tooltips, boolean urls)createBarChart3D(String title,            String categoryAxisLabel, String valueAxisLabel,            CategoryDataset dataset, PlotOrientation orientation,            boolean legend, boolean tooltips, boolean urls);//3D 的//折线图,最基础方法:createLineChart(String title,            String categoryAxisLabel, String valueAxisLabel,            CategoryDataset dataset, PlotOrientation orientation,            boolean legend, boolean tooltips, boolean urls);//同样有3D 图createXYLineChart(String title, String xAxisLabel,            String yAxisLabel, XYDataset dataset, PlotOrientation orientation,            boolean legend, boolean tooltips, boolean urls)//圆饼图,最基础方法:createMultiplePieChart(String title,            CategoryDataset dataset, TableOrder order, boolean legend,            boolean tooltips, boolean urls);createPieChart(String title, PieDataset dataset,            PieDataset previousDataset, int percentDiffForMaxScale,            boolean greenForIncrease, boolean legend, boolean tooltips,            Locale locale, boolean subTitle, boolean showDifference);//两个都有3D 方法//环形图,最基础方法:createRingChart(String title, PieDataset dataset,            boolean legend, boolean tooltips, boolean urls)//栈图,最基础方法:createStackedBarChart(String title,            String domainAxisLabel, String rangeAxisLabel,            CategoryDataset dataset, PlotOrientation orientation,            boolean legend, boolean tooltips, boolean urls);//设置与获取主题:setChartTheme(ChartTheme theme);getChartTheme()


数据集合对象 Dataset 接口的实现类:

常用几个:

DefaultCategoryDateset :默认的类别数据集合对象,用于柱状图、区域图等;

DefaultPieDateset:默认的饼状图数据集合对象,用于圆饼图;

XYSeriesCollection:描述坐标轴序列类型的数据集合,用于折线图等数据集合;

TimeSeriesCollection:描述时间序列的数据集合,用于时序图等。


绘图区对象Plot 接口的实现类:

常用的有PiePlot 、CategoryPlot 、XYPlot 三大子类,每个子类下又扩展了两个子类。Plot 主要用于使用渲染类的数据对图表进行一些样式设置,如背景色、透明度等。


坐标轴对象 Axis 类:

分为CategoryAxie 与ValueAxis 两个大子类,其中ValueAxis 中扩展为NumberAxis 与DateAxis 等子类。用于设置坐标轴范围、坐标轴箭头形状、坐标轴透明度等。


图片渲染对象 AbstractRenderer 类:

主要定义标签字体、字体大小、字体颜色等。


三、ServletUtilities 类

jfreechart jar包中org.jfree.chart.servlet包提供了三个十分方便的类,用于将图表生成图片并可获取。

DisplayChart 类:

继承于HttpServlet ,所以使用时配置servlet 即可。其service 方法中实现了访问本地图表的图片文件的方法(该图片由ServletUtilities 类创建)。

该servlet 的service 部分代码如下:

HttpSession session = request.getSession();String filename = request.getParameter("filename");
所以通过该servlet 访问报表文件时,传递的文件名的参数名只能为filename。


ServletUtilities 类:

用于与servlet 关联的对JFreeChart 的操作。主要有以下静态方法:

//生成报表图片saveChartAsJPEG(JFreeChart chart, int width, int height, HttpSession session);saveChartAsJPEG(JFreeChart chart, int width,int height, ChartRenderingInfo info, HttpSession session)saveChartAsPNG(JFreeChart chart, int width, int height,HttpSession session);saveChartAsPNG(JFreeChart chart, int width, int height,ChartRenderingInfo info, HttpSession session)//设置与获取图片位置信息前缀,通过源码发现,用于作为图片的文件名setTempFilePrefix(String prefix)getTempFilePrefix();setTempOneTimeFilePrefix(String prefix)//用于调用saveChartAsJEPG等方法传入的session 为null时getTempOneTimeFilePrefix()//向客户端发送图片sendTempFile(File file, HttpServletResponse response);sendTempFile(File file, HttpServletResponse response,String mimeType);sendTempFile(String filename,HttpServletResponse response);

ChartDeleter 类:

是一个HttpSessionBindingListener 实现类,且实现了Seriable 接口,用于管理监听会话并管理图片

addChart(String filename);isChartAvailable(String filename);

其valueBound 方法无无作为,valueUnbound 方法实现如下:

@Override    public void valueUnbound(HttpSessionBindingEvent event) {        Iterator iter = this.chartNames.listIterator();        while (iter.hasNext()) {            String filename = (String) iter.next();            File file = new File(                System.getProperty("java.io.tmpdir"), filename            );            if (file.exists()) {                file.delete();            }        }    }
注:会话结束时删除临时图表文件,具体细节没深究。



三、JFreeChart 基础实践


来点实践加深印象。


1、3D 柱状图:

自定义柱状图类:数据集类取DefaultCategoryDataset 类

public class SimpleBarChart {private DefaultCategoryDataset dataSet= null;public JFreeChart chart= null;public SimpleBarChart(){dataSet= new DefaultCategoryDataset();dataSet.addValue(100, "2016年", "前4月");dataSet.addValue(50, "2016年", "中4月");dataSet.addValue(90, "2016年", "后4月");dataSet.addValue(300, "2017年", "前4月");dataSet.addValue(200, "2017年", "中4月");dataSet.addValue(100, "2017年", "后4月");StandardChartTheme theme= new StandardChartTheme("CN");theme.setExtraLargeFont(new Font("隶书",Font.BOLD,20));theme.setRegularFont(new Font("微软雅黑",Font.PLAIN,15));theme.setLargeFont(new Font("微软雅黑",Font.PLAIN,15));ChartFactory.setChartTheme(theme);//通过Chart工厂创建JFreeChartchart= ChartFactory.createBarChart3D("访问量统计", null, "访问人数", //x与y轴 名称dataSet, PlotOrientation.VERTICAL,//设置柱状纵向延伸true, true, true);//显示图例、工具条(此处没设置工具条)、超链接(没实现)chart.addSubtitle(new ShortTextTitle("子标题,可以添加多个"));chart.addSubtitle(new DateTitle());//添加一个日期子标题}public JFreeChart getChart(){return chart;}


2、3D 圆饼图:
自定义圆饼图类:数据集类取DefaultPieDataset

public class SimplePieChart {private JFreeChart pieChart=null;private DefaultPieDataset dataSet= null;public SimplePieChart(){dataSet=new DefaultPieDataset();dataSet.setValue("2014年", 1000);dataSet.setValue("2015年", 3000);dataSet.setValue("2016年", 5000);dataSet.setValue("2017年", 4000);pieChart=ChartFactory.createPieChart3D("chartTitle", dataSet, true, true, false);//设置背景图片//pieChart.setBackgroundImage(image);//设置背景色//pieChart.setBackgroundPaint(Paint 类型对象);pieChart.setBackgroundPaint(new GradientPaint(0, 0, new Color(200,200,200),300, 300, new Color(100,100,100)));//设置背景透明度pieChart.setBackgroundImageAlpha(0.8f);        // 自定义主标题位置与字体        TextTitle t = pieChart.getTitle();        t.setHorizontalAlignment(HorizontalAlignment.LEFT);        t.setPaint(new Color(240, 240, 240));        t.setFont(new Font("Arial", Font.BOLD, 26));                //Plot 类为绘图区对象        PiePlot plot = (PiePlot) pieChart.getPlot();        plot.setBackgroundPaint(null);        plot.setInteriorGap(0.04);        plot.setOutlineVisible(false);        // 为节标签设置外轮廓与GrandientPaint 对象,坐标中心(0,0)为圆的中心        plot.setSectionPaint("2014年", createGradientPaint(new Color(200, 0, 0), Color.BLUE));        plot.setSectionPaint("2015年", createGradientPaint(new Color(0, 200, 0), Color.RED));        plot.setSectionPaint("2016年", createGradientPaint(new Color(0, 0, 200), Color.GREEN));        plot.setSectionPaint("2017年", createGradientPaint(new Color(200, 200, 200), Color.YELLOW));        plot.setBaseSectionOutlinePaint(Color.WHITE);        plot.setSectionOutlinesVisible(true);        plot.setBaseSectionOutlineStroke(new BasicStroke(2.0f));        // 自定义节标签外观,此处标签指从圆饼图中用线引出的部分        plot.setLabelFont(new Font("Courier New", Font.BOLD, 20));        //设置连接线为红色        plot.setLabelLinkPaint(Color.RED);        //设置连接线粗细,1.0表示常规大小,此处设置为了2倍,为40        plot.setLabelLinkStroke(new BasicStroke(2.0f));        //设置是否描绘标签外轮廓        plot.setLabelOutlineStroke(null);        plot.setLabelPaint(Color.WHITE);        plot.setLabelBackgroundPaint(null);                //添加子标题        TextTitle source = new TextTitle("subTitle",                 new Font("Courier New", Font.PLAIN, 12));        source.setPaint(Color.WHITE);        source.setPosition(RectangleEdge.BOTTOM);        source.setHorizontalAlignment(HorizontalAlignment.CENTER);        pieChart.addSubtitle(source);}//这个方法中半径写死了,radius 应该根据自己实际画的图的大小设置,否则没效果。(copy的,原为200)private static RadialGradientPaint createGradientPaint(Color c1, Color c2) {        Point2D center = new Point2D.Float(0, 0);        float radius = 400;        float[] dist = {0.0f, 1.0f};        return new RadialGradientPaint(center, radius, dist,                new Color[] {c1, c2});    }public JFreeChart getChart(){return pieChart;}}

3、3D折线图:

自定义折线图类:使用DefaultCategoryDataset 数据集类,显示最基本的折线图

public class SimpleLineChart {private JFreeChart lineChart=null;private DefaultCategoryDataset dataset=null;public SimpleLineChart(){dataset=new DefaultCategoryDataset();dataset.addValue(0.5, "类别1", "数组据1");dataset.addValue(10.5, "类别1", "数组据2");dataset.addValue(15.5, "类别1", "数组据3");dataset.addValue(20.5, "类别1", "数组据4");dataset.addValue(9.5, "类别1", "数组据5");dataset.addValue(3.5, "类别1", "数组据6");dataset.addValue(0.5, "类别2", "数组据1");dataset.addValue(8.5, "类别2", "数组据2");dataset.addValue(17.5, "类别2", "数组据3");dataset.addValue(25.5, "类别2", "数组据4");dataset.addValue(12.5, "类别2", "数组据5");dataset.addValue(7.5, "类别2", "数组据6");lineChart=ChartFactory.createLineChart3D("标题", "x轴标签", "y轴标签", dataset, PlotOrientation.VERTICAL, true, false, false);CategoryPlot plot=(CategoryPlot) lineChart.getPlot();//获得plot 对象,plot 对象管理与数据有关的样式,如坐标轴、数据字体等CategoryAxis axis=plot.getDomainAxis();//通过plot获得坐标轴,对坐标轴数值数据组标签进行旋转,否则无法显示数据组axis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);}public JFreeChart getChart(){return lineChart;}}

4、web.xml 配置displayServlet 用于获取ServletUtilities 类生成的图片

<servlet>  <servlet-name>displayServlet</servlet-name>  <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>displayServlet</servlet-name>  <url-pattern>/displayServlet</url-pattern>  </servlet-mapping>

5、index.jsp 内容

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"    import="com.milan.charts.*,org.jfree.chart.servlet.ServletUtilities" %><!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=UTF-8"><title>使用JFreeChart</title><style type="text/css">li{margin-top:10px;}li > img{vertical-align: top;}</style></head><body><h3>显示图片</h3><%//柱状图SimpleBarChart barChart=new SimpleBarChart();String barURL=ServletUtilities.saveChartAsJPEG(barChart.getChart(), 500, 400, session);barURL=request.getContextPath()+"/displayServlet?filename="+barURL;//饼状图SimplePieChart pieChart=new SimplePieChart();String pieURL=ServletUtilities.saveChartAsJPEG(pieChart.getChart(), 500, 400, session);pieURL=request.getContextPath()+"/displayServlet?filename="+pieURL;//折线图SimpleLineChart lineChart=new SimpleLineChart();String lineURL=ServletUtilities.saveChartAsJPEG(lineChart.getChart(), 500, 400, session);lineURL=request.getContextPath()+"/displayServlet?filename="+lineURL;%><ul><li>柱状图:<img alt="显示失败" src=<%=barURL %> /></li><li>圆饼图:<img alt="显示失败" src=<%=pieURL %> /></li><li>折线图:<img alt="显示失败" src=<%=lineURL %> /></li></ul>


6、结果:


四、简单总结与部分问题


中文乱码解决:

第二幅图中,"年"字乱码,显示为白框。解决中文乱码问题,通过设置主题样式(StandardChartTheme 类)可解决:

StandardChartTheme theme= new StandardChartTheme("CN");theme.setExtraLargeFont(new Font("隶书",Font.BOLD,20));theme.setRegularFont(new Font("微软雅黑",Font.PLAIN,15));theme.setLargeFont(new Font("微软雅黑",Font.PLAIN,15));ChartFactory.setChartTheme(theme);

简单使用心得:

使用ChartFactory 创建某种类型的JFreeChart 实例,每个静态方法中的数据集参数类型都可使用该JFreeChart 实例的型的默认数据集,没有源代码时,你是不知道有哪些类型可用的,但默认的很好记忆。这只是对于柱状、圆饼、折线图等,其它众多图表类型的究竟使用哪种数据集,在此不整理。

DefaultCategoryDataset、DefaultPieDataset、Default...

使用大体步骤:

1、准备数据集;

2、获得JFreeChart 实例,最好通过ChartFactory 的静态方法获得;

3、获得该JFreeChart 实例的Plot 类的子类对象,如CategoryPlot ,设置数据显示格式,如字体大小、字体等;可选

4、通过Plot 对象获取坐标轴对象,如CategoryAxis,通过该对象设置坐标轴显示风格等;可选

5、jsp 中创建自定义类的实例,用于获取JFreeChart 对象,之后通过ServletUtilities 类保存报表为图片,通过返回的文件名及配置的DisplayChart 的servlet 名组成url,作为img标签的src值,显示图片。


五、JFreeChart 中与数据库的操作

jfreechart jar 包中的 org.jfree.data.jdbc 包提供了三个可以直接查询 数据库中数据并设置在数据集合中的类:

public class JDBCCategoryDataset extends DefaultCategoryDataset{...}

可见继承于默认数据集内,基础构造方法与所有实例方法:

public JDBCCategoryDataset(String url,String driverName, String user, String passwd);//也有抛出异常,懒得写了public JDBCCategoryDataset(Connection connection);public JDBCCategoryDataset(Connection connection, String query);//初始化并执行查询,设置数据public void executeQuery(String query) throws SQLException{}//执行查询时便向数据集合中设置了数据public void executeQuery(Connection con, String query) throws SQLException//同上public boolean getTranspose()public void setTranspose(boolean transpose);//设置是否对查询的结果项进行调换,以便正确存储在数据集中

public class JDBCXYDataset extends AbstractXYDataset implements XYDataset, TableXYDataset, RangeInfo{...}

也继承于某个数据集,主要方法:

public JDBCXYDataset(String url, String driverName,String user, String password) throws SQLException, ClassNotFoundExceptionpublic JDBCXYDataset(Connection con) throws SQLExceptionpublic JDBCXYDataset(Connection con, String query) throws SQLExceptionpublic void close();关闭连接public void executeQuery(String query) throws SQLExceptionpublic void executeQuery(Connection con, String query)throws SQLException等

public class JDBCPieDataset extends DefaultPieDataset{...}

所有方法:

public JDBCPieDataset(String url,String driverName, String user, String passwd);//也有抛出异常,懒得写了public JDBCPieDataset(Connection connection);public JDBCPieDataset(Connection connection, String query);//初始化并执行查询,设置数据public void executeQuery(String query) throws SQLException{}//执行查询时便向数据集合中设置了数据public void executeQuery(Connection con, String query) throws SQLException//同上public void close()//关闭数据库连接


上面三个类直接从数据库获取数据,得到数据集Dataset 的子类对象,用于创建JFreeChart 实例,所以减少了查询数据库的编程。只能用于查询!






0 0
原创粉丝点击