From 847cdeb15a134dce551a28c1b5e2c0b519ca92b3 Mon Sep 17 00:00:00 2001 From: Jone <515616805@qq.com> Date: Mon, 31 Jul 2023 10:05:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0jfreechart=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operational/data/controller/BarChartDemo.java | 236 +++++++++++++++++++++ .../data/controller/CustomRenderer.java | 36 ++++ 2 files changed, 272 insertions(+) create mode 100644 hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/BarChartDemo.java create mode 100644 hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/CustomRenderer.java diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/BarChartDemo.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/BarChartDemo.java new file mode 100644 index 0000000..85747a3 --- /dev/null +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/BarChartDemo.java @@ -0,0 +1,236 @@ +package com.hnac.hzims.operational.data.controller; + +import java.awt.*; +import java.io.FileOutputStream; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +import com.hnac.hzims.operational.report.vo.TicketChartCell; +import com.hnac.hzims.operational.report.vo.TicketChartVo; +import com.hnac.hzims.ticket.constants.TicketConstants; +import org.jfree.chart.ChartFactory; +import org.jfree.chart.ChartFrame; +import org.jfree.chart.ChartUtils; +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.StandardCategoryItemLabelGenerator; +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.StandardBarPainter; +import org.jfree.chart.title.TextTitle; +import org.jfree.data.category.CategoryDataset; +import org.jfree.data.category.DefaultCategoryDataset; + +public class BarChartDemo { +// public static void main(String[] args) { +// // 1. 得到数据 +// CategoryDataset dataset = getDataSetTicket(); +//// CategoryDataset dataset = getDataSet(); +//// CategoryDataset dataset = getDataSet3(); +// // 2. 构造chart +// JFreeChart chart = ChartFactory.createBarChart( +// "水果产量图", // 图表标题 +// "水果", // 目录轴的显示标签--横轴 +// "产量", // 数值轴的显示标签--纵轴 +// dataset, // 数据集 +// PlotOrientation.VERTICAL, // 图表方向:水平、 +// true, // 是否显示图例(对于简单的柱状图必须 +// false, // 是否生成工具 +// false // 是否生成URL链接 +// ); +// // 3. 处理chart中文显示问题 +// iSetBarChart(chart); +// +// // 4. chart输出图片 +//// writeChartAsImage(chart, "fruit.jpg"); +// writeChartAsImage(chart, "ticket.jpg"); +// +//// writeChartAsImage(chart, "fruit2.jpg"); +// +// // 5. chart 以swing形式输出 +// ChartFrame pieFrame = new ChartFrame("水果生产", chart); +// pieFrame.pack(); +// pieFrame.setVisible(true); +// +// } + + /** + * 获取一个演示用的组合数据集对象 + * + * @return + */ + private static CategoryDataset getDataSet() { + DefaultCategoryDataset dataset = new DefaultCategoryDataset(); + dataset.addValue(100, "北京", "苹果"); + dataset.addValue(120, "上海", "苹果"); + dataset.addValue(160, "广州", "苹果"); + dataset.addValue(210, "北京", "梨子"); + dataset.addValue(220, "上海", "梨子"); + dataset.addValue(230, "广州", "梨子"); + dataset.addValue(330, "北京", "葡萄"); + dataset.addValue(340, "上海", "葡萄"); + dataset.addValue(340, "广州", "葡萄"); + dataset.addValue(420, "北京", "香蕉"); + dataset.addValue(430, "上海", "香蕉"); + dataset.addValue(400, "广州", "香蕉"); + dataset.addValue(510, "北京", "荔枝"); + dataset.addValue(530, "上海", "荔枝"); + dataset.addValue(510, "广州", "荔枝"); + return dataset; + } + + private static CategoryDataset getDataSet3() { + DefaultCategoryDataset dataset = new DefaultCategoryDataset(); + dataset.addValue(100, "北京", "苹果"); + dataset.addValue(210, "北京", "梨子"); + dataset.addValue(330, "北京", "葡萄"); + dataset.addValue(420, "北京", "香蕉"); + dataset.addValue(510, "北京", "荔枝"); + return dataset; + } + + + private static CategoryDataset getDataSetTicket() { + List ticketList = new ArrayList<>(); + TicketConstants.TicketTypeNameEnum[] values = TicketConstants.TicketTypeNameEnum.values(); + TicketChartVo sum=new TicketChartVo(); + List sas = new ArrayList<>(); + sum.setDeptName("总计"); + for (TicketConstants.TicketTypeNameEnum value : values) { + TicketChartCell ticketChartCell = new TicketChartCell(); + ticketChartCell.setTicketType(value.getType()); + ticketChartCell.setTicketName(value.getFileName()); + Integer integer = Integer.valueOf(value.getType()); + ticketChartCell.setTicketMon(30+ integer); + BigDecimal d=BigDecimal.valueOf(integer).divide(BigDecimal.valueOf(100),2,BigDecimal.ROUND_UP); + ticketChartCell.setTicketMonPerc(0.3+ d.doubleValue()); + sas.add(ticketChartCell); + } + sum.setChartCells(sas); + ticketList.add(sum); + //两票柱状图数据 + // 创建数据 + DefaultCategoryDataset dataset = new DefaultCategoryDataset(); +// for (TicketChartVo chartVo : ticketList) { +// for (int i = 0; i < chartVo.getChartCells().size(); i++) { +// TicketChartCell ticketChartCell = chartVo.getChartCells().get(i); +// dataset.addValue(ticketChartCell.getTicketMon(), ticketChartCell.getTicketName(), ticketChartCell.getTicketName()); +// } +// } + + dataset.addValue(33+1, "", "倒闸操作票"); + dataset.addValue(33+2,"", "开机操作票"); + dataset.addValue(33+3,"", "停机操作票"); + dataset.addValue(33+4,"", "第一种工作票"); + dataset.addValue(33+5,"", "第二种工作票"); + dataset.addValue(33+6,"", "水力机械票"); + return dataset; + } + + /** + * 解决图表汉字显示问题 + * + * @param chart + */ + private static void processChart(JFreeChart chart) { + CategoryPlot plot = chart.getCategoryPlot(); + CategoryAxis domainAxis = plot.getDomainAxis(); + ValueAxis rAxis = plot.getRangeAxis(); + chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING, + RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); + TextTitle textTitle = chart.getTitle(); + textTitle.setFont(new Font("宋体", Font.PLAIN, 20)); + domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11)); + domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12)); + rAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12)); + rAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12)); + chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12)); + // renderer.setItemLabelGenerator(new LabelGenerator(0.0)); + // renderer.setItemLabelFont(new Font("宋体", Font.PLAIN, 12)); + // renderer.setItemLabelsVisible(true); + } + + /** + * 输出图片 + * + * @param chart + */ + private static void writeChartAsImage(JFreeChart chart, String fileName) { + FileOutputStream fos_jpg = null; + try { + fos_jpg = new FileOutputStream("D:\\test\\"+fileName); + ChartUtils.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null); +// ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + fos_jpg.close(); + } catch (Exception e) { + } + } + } + + + public static void iSetBarChart(JFreeChart chart) { + CategoryPlot categoryplot = chart.getCategoryPlot();// 图本身 + ValueAxis rangeAxis = categoryplot.getRangeAxis(); + CategoryAxis domainAxis = categoryplot.getDomainAxis(); + // 设置Y轴的提示文字样式 + rangeAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); + // 设置Y轴刻度线的长度 + rangeAxis.setTickMarkInsideLength(10f); + + domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的 + domainAxis.setLowerMargin(0.1); + domainAxis.setUpperMargin(0.1); + + // rangeAxis.setTickMarkOutsideLength(10f); + // 设置X轴下的标签文字 + domainAxis.setLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); + // 设置X轴上提示文字样式 + domainAxis.setTickLabelFont(new Font("微软雅黑", Font.PLAIN, 12)); + NumberAxis vn = (NumberAxis) categoryplot.getRangeAxis(); + + // 设置Y轴的数字为百分比样式显示设置Y轴的数字为百分比样式显示 + DecimalFormat df = new DecimalFormat("0.0"); + vn.setNumberFormatOverride(df); + // 使柱状图反过来显示 + // vn.setInverted(true); + // vn.setVerticalTickLabels(true); + + // 自定义柱状图中柱子的样式 + CustomRenderer brender = new CustomRenderer(); + // 设置柱状图的顶端显示数字 + brender.setIncludeBaseInRange(true); + brender.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator()); + brender.setDefaultItemLabelsVisible(true); + // 设置柱子为平面图不是立体的 + brender.setBarPainter(new StandardBarPainter()); + // 设置柱状图之间的距离0.1代表10%; + brender.setItemMargin(0.3); + // 设置柱子的阴影,false代表没有阴影 + brender.setShadowVisible(false); + + // 设置图的背景为白色 + categoryplot.setBackgroundPaint(Color.WHITE); + // 设置背景虚线的颜色 + categoryplot.setRangeGridlinePaint(Color.decode("#B6A2DE")); + // 去掉柱状图的背景边框,使边框不可见 + categoryplot.setOutlineVisible(false); + // 设置标题的字体样式 + chart.getTitle().setFont(new Font("微软雅黑", Font.PLAIN, 24)); + // 设置图表下方图例上的字体样式 + chart.getLegend().setItemFont(new Font("微软雅黑", Font.PLAIN, 12)); + + categoryplot.setRenderer(brender); + + + } +} diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/CustomRenderer.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/CustomRenderer.java new file mode 100644 index 0000000..d79a2cc --- /dev/null +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/data/controller/CustomRenderer.java @@ -0,0 +1,36 @@ +package com.hnac.hzims.operational.data.controller; +import lombok.Data; + +import java.awt.*; + +/** + * 类描述: 重写BarRenderer类 + * + * @author Jack_Liberty + * @version 1.0 + * @date 2021-04-01 11:30 + */ +@Data +public class CustomRenderer extends org.jfree.chart.renderer.category.BarRenderer { + + /** + * 柱子颜色 + */ + private Paint[] colors; + + public CustomRenderer() { + /** + * 初始化柱子颜色 + */ + String[] colorValues = {"#C0504D", "#E46C0A", "#4F81BD", "#00B050", "#7030A0", "#00BF00"}; + colors = new Paint[colorValues.length]; + for (int i = 0; i < colorValues.length; i++) { + colors[i] = Color.decode(colorValues[i]); + } + } + + @Override + public Paint getItemPaint(int i, int j) { + return colors[j % colors.length]; + } +}