`

JFreechart别人

阅读更多
CreateChartService.java
完成报表的生成,项目只要柱状图和折线图,所以只生成了2中图形,
类中还有JFreeChart 数据的转换方法,JFreeChart相关的配置方法

Java代码 
import java.awt.Color; 
import java.awt.Font; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import net.bingosoft.common.config.Config; 
 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
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.axis.ValueAxis; 
import org.jfree.chart.labels.ItemLabelAnchor; 
import org.jfree.chart.labels.ItemLabelPosition; 
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; 
import org.jfree.chart.labels.StandardCategoryToolTipGenerator; 
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.LineAndShapeRenderer; 
import org.jfree.chart.title.TextTitle; 
import org.jfree.data.category.CategoryDataset; 
import org.jfree.data.general.DatasetUtilities; 
import org.jfree.data.general.DefaultPieDataset; 
import org.jfree.data.general.PieDataset; 
import org.jfree.ui.TextAnchor; 
 
public class CreateChartService { 
 
    private static Log log = LogFactory.getLog(CreateChartService.class); 
     
    // 图片的生成路径 
    private static final String CHART_PATH = Config.getString("image.filepath");    
     
    /**  
     * 生成折线图  
     * 1.解析数据<br>
     * 2.迭代数据,产出图片数据流,并添加到List<br>
     * @throws IOException 
     */   
    public List createLineAndShapeChart(double[][]data , String[]rowKeys,String[] columnKeys,ChartEntity entity) throws IOException {    
        List list = new ArrayList() ; 
        byte[] bytes = new byte[]{} ; 
        // 解析数据 
        Map map = this.parseDataForBarPage(data, rowKeys, columnKeys) ; 
        int pageNum = Integer.parseInt(""+map.get("pageNum")) ; 
        // 迭代,产生图片数据流 
        for(int i=0 ; i<pageNum ; i++){ 
            bytes = createSingleLineAndShapeChart((double[][])(map.get("data"+i)),(String[])(map.get("rowKeys"+i)), 
                    (String[])(map.get("columnKeys"+i)),entity) ;  
            list.add(bytes) ; 
        } 
        return list ; 
    }    
     
    /**
     * 生成单个折线图数据流  
     * @param data
     * @param rowKeys
     * @param columnKeys
     * @param entity
     * @return
     * @throws IOException
     */  
    public byte[] createSingleLineAndShapeChart(double[][]data , String[]rowKeys,String[] columnKeys,ChartEntity entity) throws IOException {    
        CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);    
        JFreeChart chart = createTimeXYChar(dataset, entity); 
        byte[] bytes = this.createImage(chart, entity) ; 
        return bytes ; 
    }    
     
     
    /**
     * 生成柱状图<br>
     * 1.解析数据<br>
     * 2.迭代数据,产出图片数据流,并添加到List<br>
     * @param data 数据
     * @param rowKeys 行
     * @param columnKeys 列
     * @param entity 图片配置对象
     * @return 包含多个图片数据流的List
     * @throws IOException
     */ 
    public List createStackedBarChart(double[][]data,String[]rowKeys,String[]columnKeys , ChartEntity entity) throws IOException { 
        // 解析数据 
        List list = new ArrayList() ; 
        byte[] bytes = new byte[]{} ; 
        Map map = this.parseDataForBarPage(data, rowKeys, columnKeys) ; 
        int pageNum = Integer.parseInt(""+map.get("pageNum")) ; 
        // 迭代数据,产出图片数据流,并添加到List 
        for(int i=0 ; i<pageNum ; i++){ 
            bytes = createSingleStackedBarChart((double[][])(map.get("data"+i)),(String[])(map.get("rowKeys"+i)), 
                    (String[])(map.get("columnKeys"+i)),entity) ;  
            list.add(bytes) ; 
        } 
        return list ; 
    } 
     
    /**
     * 解析生成柱状图分页数据
     * @param data
     * @param rowKeys
     * @param columnKeys
     * @return
     */ 
    private Map parseDataForBarPage(double[][]data,String[]rowKeys,String[]columnKeys){ 
        Map map = new HashMap() ; 
         
        double [][] pageData = null ; 
        String [] pageColumn = null ; 
         
        int sumColumnNum = columnKeys.length ; // 总列数 
        int indexNum = Config.getInt("image.export.pagesize", 10) ;// 分页的列数 
        int pageNum = sumColumnNum%indexNum==0 ? sumColumnNum/indexNum : sumColumnNum/indexNum+1 ; // 分页数 
        int rowNum = rowKeys.length ; 
         
//      log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" "); 
         
        // 解析传递过来的数据 
        for(int i=0 ; i<pageNum ; i++){ 
            int columnNum = (sumColumnNum-i*indexNum)/indexNum>0 ? indexNum : (sumColumnNum-i*indexNum)%indexNum ;//当前页列数 
            pageData = new double[rowNum][columnNum] ; 
            // 取数据值 
            for(int j=0 ; j<rowNum ; j++){ 
                pageColumn = new String[columnNum] ; 
                for(int k=0 ; k<columnNum ; k ++){ 
                    pageData[j][k] = data[j][k+i*indexNum] ; // 数据 
                } 
            } 
            // 取列值 
            for(int j=0 ; j<columnNum ; j++){ 
                pageColumn[j] = columnKeys[j+i*indexNum] ; // 列 
            } 
            // 保存数据并返回 
            map.put("data"+i, pageData) ; 
            map.put("rowKeys"+i, rowKeys) ; 
            map.put("columnKeys"+i, pageColumn) ; 
        } 
        // 保存分页数 
        map.put("pageNum", pageNum); 
        return map ; 
    } 
     
    /**
     * 解析生成折线图分页数据
     * @param data
     * @param rowKeys
     * @param columnKeys
     * @return
     */ 
    private Map parseDataForLinePage(double[][]data,String[]rowKeys,String[]columnKeys){ 
        Map map = new HashMap() ; 
         
        double [][] pageData = null ; 
        String [] pageColumn = null ; 
         
        int sumColumnNum = columnKeys.length ; // 总列数 
        int indexNum = Config.getInt("image.export.pagesize", 10) ;// 分页的列数 
        int pageNum = sumColumnNum%indexNum==0 ? sumColumnNum/indexNum : sumColumnNum/indexNum+1 ; // 分页数 
        int rowNum = rowKeys.length ; 
         
//      log.debug("data.length="+data.length+"sumColumnNum="+sumColumnNum+" indexNum="+indexNum+" pageNum="+pageNum+" rowNum="+rowNum+" "); 
         
        // 解析传递过来的数据 
        for(int i=0 ; i<pageNum ; i++){ 
            int columnNum = (sumColumnNum-i*indexNum)/indexNum>0 ? indexNum : (sumColumnNum-i*indexNum)%indexNum ;//当前页列数 
            pageData = new double[rowNum][columnNum] ; 
            // 取数据值 
            for(int j=0 ; j<rowNum ; j++){ 
                pageColumn = new String[columnNum] ; 
                for(int k=0 ; k<columnNum ; k ++){ 
                    pageData[j][k] = data[j][k+i*indexNum] ; // 数据 
                } 
            } 
            // 取列值 
            for(int j=0 ; j<columnNum ; j++){ 
                pageColumn[j] = columnKeys[j+i*indexNum] ; // 列 
            } 
            // 保存数据并返回 
            map.put("data"+i, pageData) ; 
            map.put("rowKeys"+i, rowKeys) ; 
            map.put("columnKeys"+i, pageColumn) ; 
        } 
        // 保存分页数 
        map.put("pageNum", pageNum); 
        return map ; 
    } 
     
    /**  
     * 生成单个堆栈柱状图  
     * @return 图片数据流
     * @throws IOException 
     */   
    public byte[] createSingleStackedBarChart(double[][]data,String[]rowKeys,String[]columnKeys , ChartEntity entity) throws IOException {    
        CategoryDataset dataset = getBarData(data, rowKeys, columnKeys);    
        JFreeChart chart = createStackedBarChart(dataset, entity);  
        byte[] bytes = this.createImage(chart, entity) ; 
        return bytes ; 
    }   
     
    // 柱状图,折线图 数据集    
    private CategoryDataset getBarData(double[][] data, String[] rowKeys,    
            String[] columnKeys) {    
        return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);    
   
    }    
   
    /**  
     * 判断文件夹是否存在,如果不存在则新建  
     * @param chartPath  
     */   
    private void isChartPathExist(String chartPath) {    
        File file = new File(chartPath);    
        if (!file.exists()) {    
            file.mkdirs();    
        }    
    }    
   
    /**  
     * 折线图  
     *   
     * @param chartTitle  
     * @param x  
     * @param y  
     * @param xyDataset  
     * @param charName  
     * @return  
     */   
    private JFreeChart createTimeXYChar(CategoryDataset xyDataset,ChartEntity entity) {    
   
        JFreeChart chart = ChartFactory.createLineChart( 
                entity.getTitle(),  
                entity.getXname(),  
                entity.getYname(),    
                xyDataset,  
                PlotOrientation.VERTICAL,  
                true,  
                true,  
                false);    
   
        chart.setTextAntiAlias(false);    
        chart.setBackgroundPaint(Color.WHITE);    
   
        CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();    
        // 没有数据时显示 
        this.configNoData(chart, "没有查询到数据 !") ; 
         
        // x轴 // 分类轴网格是否可见    
        categoryplot.setDomainGridlinesVisible(true);    
        // y轴 //数据轴网格是否可见    
        categoryplot.setRangeGridlinesVisible(true);    
   
        categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩    
   
        categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩    
   
        categoryplot.setBackgroundPaint(Color.lightGray);    
   
         
        // 配置字体 
        this.configFont(chart) ; 
   
        // x轴设置 
        CategoryAxis domainAxis = categoryplot.getDomainAxis();    
         
        // 设置距离图片左端距离    
        domainAxis.setLowerMargin(0.0);    
        // 设置距离图片右端距离    
        domainAxis.setUpperMargin(0.0); 
        domainAxis.setTickLabelPaint(Color.BLUE) ; 
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示   
   
        NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();    
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());    
        numberaxis.setAutoRangeIncludesZero(true);    
   
        // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!    
        LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();    
        lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见    
        lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见    
   
        // 显示折点数据    
        lineandshaperenderer.setBaseItemLabelGenerator(new    
        StandardCategoryItemLabelGenerator());    
        lineandshaperenderer.setBaseItemLabelsVisible(true);    
         
        return chart ; 
    }    
   
    /**  
     * 堆栈柱状图  
     *   
     * @param dataset  
     * @param xName  
     * @param yName  
     * @param chartTitle  
     * @param charName  
     * @return  
     */   
    private JFreeChart createStackedBarChart(CategoryDataset dataset, ChartEntity entity) {    
         
        JFreeChart chart = ChartFactory.createStackedBarChart3D( 
                entity.getTitle(),  
                entity.getXname(),  
                entity.getYname(),  
                dataset,  
                PlotOrientation.VERTICAL,  
                true,  
                false,  
                false ); 
         
        // 没有数据配置 
        this.configNoData(chart,"没有查询到数据 !") ; 
         
        // 配置字体 
        this.configFont(chart) ; 
         
        // 配置 Renderer 
        this.configBarRenderer(chart) ; 
         
        // 其他配置 
        this.configOtherForBar(chart) ; 
         
        return chart ; 
    }    
     
    /**
     * 配置字体 
     * @param chart JFreeChart 对象
     */ 
    private void configFont(JFreeChart chart){ 
        // 配置字体 
        Font xfont = new Font("宋体",Font.PLAIN,12) ;// X轴 
        Font yfont = new Font("宋体",Font.PLAIN,12) ;// Y轴 
        Font kfont = new Font("宋体",Font.PLAIN,12) ;// 底部 
        Font titleFont = new Font("隶书", Font.BOLD , 25) ; // 图片标题 
        CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象 
         
        // 图片标题 
        chart.setTitle(new TextTitle(chart.getTitle().getText(),titleFont)); 
         
        // 底部 
        chart.getLegend().setItemFont(kfont); 
         
        // X 轴 
        CategoryAxis domainAxis = plot.getDomainAxis();    
        domainAxis.setLabelFont(xfont);// 轴标题 
        domainAxis.setTickLabelFont(xfont);// 轴数值   
        domainAxis.setTickLabelPaint(Color.BLUE) ; // 字体颜色 
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的label斜显示  
         
        // Y 轴 
        ValueAxis rangeAxis = plot.getRangeAxis();    
        rangeAxis.setLabelFont(yfont);  
        rangeAxis.setLabelPaint(Color.BLUE) ; // 字体颜色 
        rangeAxis.setTickLabelFont(yfont);   
         
    } 
     
    /**
     * 配置柱状图
     * @param chart
     */ 
    private void configBarRenderer(JFreeChart chart){ 
         
        CategoryPlot categoryplot = (CategoryPlot)chart.getPlot(); 
//       自定义显示柱子上的总值 
        ExtendedStackedBarRenderer extendedstackedbarrenderer = new ExtendedStackedBarRenderer(); 
        extendedstackedbarrenderer.setBaseItemLabelsVisible(true); 
        extendedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); 
        extendedstackedbarrenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator()); 
        categoryplot.setRenderer(extendedstackedbarrenderer); 
         
        BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); 
        barrenderer.setDrawBarOutline(false); 
        barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); 
        barrenderer.setBaseItemLabelsVisible(true); 
        barrenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER)); 
        barrenderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER)); 
         
        // 柱子显示数值 
//        barrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}",new DecimalFormat("0.0%")));     
//        barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); 
        barrenderer.setItemLabelFont(new Font("Arial Unicode MS",Font.PLAIN,9));   
        barrenderer.setItemLabelsVisible(true); 
         
//      如果数值没有显示空间,设置显示格式 
//      ItemLabelPosition itemLabelPositionFallback=new ItemLabelPosition( 
//              ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT, 
//              TextAnchor.HALF_ASCENT_LEFT,0D); 
//      barrenderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback); 
//      barrenderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback); 
         
        categoryplot.setRenderer(barrenderer) ; 
    } 
     
    /**
     * 配置没有数据时的显示信息
     * @param chart
     */ 
    private void configNoData(JFreeChart chart,String message){ 
        CategoryPlot categoryplot = (CategoryPlot)chart.getPlot(); 
        // 没有数据时的显示 
        categoryplot.setNoDataMessage(message) ; 
        categoryplot.setNoDataMessageFont(new Font("黑体",Font.BOLD,25)) ; 
    } 
     
    /**
     * 其他配置
     * @param chart
     */ 
    private void configOtherForBar(JFreeChart chart){ 
  
        chart.setTextAntiAlias(false);   // 图例字体清晰   
   
        chart.setBackgroundPaint(Color.WHITE); // 背景颜色  
         
        CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象 
        NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();    
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());    
        numberaxis.setAutoRangeIncludesZero(true);  
    } 
 
    /**
     * 创建图片的数据流
     * @param chart
     * @param entity 图片配置对象
     * @return 图片数据流
     * @throws IOException
     */ 
    private byte[] createImage(JFreeChart chart , ChartEntity entity) throws IOException{ 
        return ChartUtilities.encodeAsPNG(chart.createBufferedImage(entity.getWidth(), entity.getHeight())) ; 
    } 
     
    /**
     * 创建图片文件到硬盘
     * @param chart
     * @param entity
     * @throws IOException
     */ 
    private void createImageFile(JFreeChart chart , ChartEntity entity) throws IOException{ 
        FileOutputStream fos_jpg = null;    
        try {    
            isChartPathExist(CHART_PATH);    
            String chartName = CHART_PATH + entity.getFileName();    
            fos_jpg = new FileOutputStream(chartName);    
            ChartUtilities.writeChartAsJPEG(fos_jpg, chart, entity.getWidth(), entity.getHeight()) ; 
        } catch (Exception e) {    
            e.printStackTrace();    
        } finally {    
            try {    
                fos_jpg.close();    
            } catch (Exception e) {    
                e.printStackTrace();    
            }    
        }    
    } 
}
分享到:
评论

相关推荐

    最好的Java反编译工具(jfreechart-1.0.9-demo.jar源码)

    Java反编译是将已编译的字节码(.class文件)转换回源代码的...然而,反编译他人的代码可能存在法律风险,必须确保遵循开源许可协议,并尊重原作者的知识产权。在实际操作中,建议先查阅相关许可信息,确保合法合规。

    jfreechart jar

    ”意味着这个jar包是开发人员分享出来供他人使用的资源,可以帮助需要进行数据可视化的开发者快速构建图形界面。 在标签中提到的“jfreechart”,再次强调了这个话题的核心——JFreeChart库。它是Java开发中处理...

    JFreeChart在jsp中显示柱状图、饼图

    在修改代码时,建议重构以提高可读性和维护性,同时添加适当的注释以方便他人理解。 总之,这个项目展示了如何结合JFreeChart、JSP和Oracle数据库实现数据可视化的Web应用。通过学习这个项目,你可以掌握如何在Java...

    struts2 jfreechart 即时曲线图

    这是一个struts2+jfreechart的完整源码程序。tomcat运行后可看到简单的饼形图和柱状图。运行DemoTest/RealTimeChart可看到即时曲线图示例。本来这些应资源共享,可下载别人好东西时需要积分,所以设置为1分。希望...

    jfreechart怎么报表

    别的组问我们项目经理要报表模块,本来不打算给的,但是是经理要求,没办法,既然打包发给别人了,顺便穿一份上来,能看懂的就尽管下吧,与人有益 与我有益。本包是一个jfreechart的完整模块,只是口径不是很多,...

    Improving-JFreeChart:对开源软件进行质量测试

    10. **社区参与:** 开源项目需要社区的支持,因此改进过程应考虑与社区的沟通,接受反馈并鼓励他人贡献。 通过以上分析,我们可以看到改善JFreeChart涉及的知识点广泛,涵盖Java编程、测试技术、性能优化等多个...

    基于J2SE+Awt+Swing+Mysql餐厅前台+后台管理系统源码.zip

    它包括普通的人员关系,物品管理等最特色的是他使用Jfreechart.jar 实现的报表效果,折线图 显示当前月,天,年,各类物品的销售,圆饼图,柱形图用于各类信息的动态显示(数据从数据库动态提取),可以通过鼠标放大,...

    教你一步一步反编译并得到所有源代码

    ### 教你一步一步反编译并得到所有源代码 在软件开发领域,有时我们需要对一些已有的二进制文件或类文件进行逆向工程...需要注意的是,在进行此类操作时应确保不会侵犯他人的知识产权,合理合法地使用这些工具和技术。

    java实训的自我总结.doc

    此外,我还学习了JavaWeb、Servlet、JDBC数据库操作,掌握了快速建模和数据池的应用,了解了单态模式的设计思想,并通过JFreechart实现了数据可视化,同时参与了多个项目,如俄罗斯方块、人力资源管理系统和购物网站...

    java实训个人总结范文.doc

    学员意识到自己在学习态度上的松懈,有时会偷懒,对待任务不够认真,这导致与他人的差距逐渐拉大。此外,缺乏有效的交流平台和团队合作经验,如实训小组中缺少能够相互讨论和学习的伙伴,这直接影响到学习效果。面对...

    java实验报告

    3. **3D图形库**:为了生成3D柱状图,实验可能使用了Java的3D图形库,如Java3D或JFreeChart。这些库提供了丰富的API,可以方便地创建和定制3D图形。 4. **数据可视化**:在Java中,数据可视化是通过将数据转换为...

    [企业]Java企业进销存管理系统源码_jxc_j.zip

    12. **报表与统计**:系统可能包含报表功能,使用JFreeChart或ECharts生成库存、销售等数据的可视化报表,辅助决策。 对于学习者和开发者来说,这个开源项目提供了一个实践Java Web开发、理解企业进销存管理流程的...

    java词云生成器(代码,maven项目)

    为了将分析后的数据转化为可视化的词云,项目可能使用了Java的数据可视化库,如JFreeChart或JavaFX。这些库提供了创建图形,包括饼图、柱状图和自定义形状的能力,使得可以以艺术化的形式展示词频。 **5. 字体处理*...

    URL汇集、jsp、java学习中各种问题集锦

    通过收集他人的经验分享,旨在帮助更多开发者解决问题。 ### 2. JSP问题集锦 #### 2.1. 上传问题 - **链接**: [http://topic.csdn.net/t/20050105/09/3699823.html]...

    Segundo-Proyecto-EDM-:可视化程序,java

    10. **文档与注释**:良好的项目文档和代码注释可以帮助他人理解和维护项目。 总体来说,"Segundo-Proyecto-EDM-"是一个涉及Java编程、GUI设计、数据处理和可视化的综合项目,对于想要提升Java技能和数据可视化能力...

    JAVA核心技术

    页面可以做的很漂亮,结合echopoint,可以作出很多图形效果(里面用了jfreechart包)。使用SWING的思想来作网页,把HTML当作JAVA的类来做。但是大量使用Session,页面分帧(Frame)很多,系统资源消耗很大。??免费。?...

    TwitWeightHomework

    6. **可视化展示**:结果可能需要通过图表展示出来,如使用JavaFX或JFreeChart等库制作图形,以便直观地理解数据分布和趋势。 7. **文件操作**:可能需要将抓取和处理的数据保存到本地文件,以便后续分析或备份。...

    histograma:卡塔2

    4. **图形绘制**:Java提供了多种库来绘制图形,例如Java AWT和Swing库可以创建基本的图形界面,JFreeChart库则支持更复杂的图表绘制。在Kata 2中,可能需要你使用这些库或者自定义方法来绘制直方图。 5. **输入/...

Global site tag (gtag.js) - Google Analytics