Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 327|回复: 0

[Swing学习]使用Java2D绘制饼图

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-9 23:56:53 | 显示全部楼层 |阅读模式
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.math.*;
    import java.util.*;
    import java.awt.geom.Arc2D;
    import java.awt.geom.*;
    import java.awt.Polygon;
    import java.util.Date;
    public class CakeChart extends JFrame {
            // 初始数据
            private double data[] = { 100., 150, 113., 127., 299.234, 120., 93., 123.,
                            127., 199., 157., 189. };
            private String percent[] = new String[data.length]; // 每个数据所占百分比
            private int radian[] = new int[data.length]; // 每个数据所对应的弧度数
            private double max, min;
            // 初始化每块饼的颜色
            private int dia = 240;// 设置饼图透明度
            private Color c1 = new Color(0, 255, 0, dia);
            private Color c2 = new Color(255, 255, 0, dia);
            private Color c3 = new Color(255, 0, 0, dia);
            private Color c4 = new Color(255, 128, 64, dia);
            private Color c5 = new Color(255, 128, 255, dia);
            private Color c6 = new Color(255, 0, 128, dia);
            private Color c7 = new Color(233, 124, 24, dia);
            private Color c8 = new Color(204, 119, 115, dia);
            private Color c9 = new Color(89, 159, 230, dia);
            private Color c10 = new Color(148, 140, 179, dia);
            private Color c11 = new Color(128, 0, 64, dia);
            private Color c12 = new Color(174, 197, 208, dia);
            private Color colors[] = { c1, c2, c3, c12, c11, c6, c4, c8, c9, c10, c5,
                            c7 };
            // 统计图的宽度和高度
            private int width = 800;
            private int height = 450;
            // 定义标题起始坐标变量
            private int titleStart_x;
            private int titleStart_y;
            // 定义圆心坐标
            private int oval_x = 60;
            private int oval_y = 90;
            // 定义椭圆的长轴和短轴
            private int long_axes = 280;
            private int short_axes = 200;
            // 定义图例区域起点坐标
            private int cutlineRect_x = 70;
            private int cutlineRect_y = 450;
            // 定义图倒区域矩形的宽度和高度
            private int cutlineRect_width = 100;
            private int cutlineRect_heigth = 235;
            // 定义日期变量
            private Date date = new Date();
            // 定义统计图其他显示信息的超始坐标
            private int otherInfo_x1;
            private int otherInfo_y1;
            private int otherInfo_x2;
            private int otherInfo_y2;
            private int otherInfo_x3;
            private int otherInfo_y3;
            // 定义标题XY轴信息
            private String title = "服务器流量统计   (饼形统计图)   ";
            private String otherInfo1 = "很经典的的一个统计饼图!!";
            private String otherInfo2 = "www.eduwest.com";
            private String otherInfo3 = "绘图日期:";
            // 双缓冲设置
            private Image offScreenImage = null;
            private Graphics offScreenBuffer = null;
            public CakeChart() {
                    super("数量统计饼图");
                    setSize(800, 500);
                    setLocation(100, 177);
                    setResizable(true);
                    setVisible(true);
                    // setBackground(Color.pink);
                    init();
            }
            public void init() {
                    offScreenImage = this.createImage(width, height);
                    offScreenBuffer = offScreenImage.getGraphics();
                    NumberBudget();
                    CoorBudget();
            }
            public void NumberBudget() {
                    // 求数据中的最大值和最小值
                    max = data[0];
                    min = data[0];
                    for (int mm = 0; mm < data.length; mm++) {
                            if (data[mm] > max)
                                    max = data[mm];
                            if (data[mm] < min)
                                    min = data[mm];
                    }
                    // 对数据进行求和运算
                    float allData_sum = 0;
                    for (int s = 0; s < data.length; s++) {
                            allData_sum += data;
                    }
                    // 计算每个数据占总数的百分比
                    for (int p = 0; p < data.length; p++) {
                            percent[p] = String
                                            .valueOf(Math.round(data[p] / allData_sum * 100))
                                            + "%";
                    }
                    // 计算每个数据所对应的弧度数
                    for (int r = 0; r < data.length; r++) {
                            radian[r] = Math.round((float) data[r] / allData_sum * 360);
                    }
            }
            public void CoorBudget() {
                    // 预算标题信息的起始坐标
                    titleStart_x = 22;
                    titleStart_y = (width / 2) - (title.length() * 15 / 2);
                    // 初始化统计图其他显示信息的起始坐标(位置固定)
                    otherInfo_x1 = 390;
                    otherInfo_y1 = 450;
                    otherInfo_x2 = 400;
                    otherInfo_y2 = 480;
                    otherInfo_x3 = 390;
                    otherInfo_y3 = 5;
            }
            public void update(Graphics g) {
                    paint(g);
            }
            public void paint(Graphics g) {
                    PaintBackground(offScreenBuffer);
                    PaintChart(offScreenBuffer);
                    g.drawImage(offScreenImage, 0, 0, this);
            }
            public void PaintBackground(Graphics g) {
                    // 渐变背景初始颜色
                    Color BackStartColor = Color.white;
                    Color BackLastColor = new Color(162, 189, 230);
                    Color titleColor = Color.black;
                    Color otherInfoColor = new Color(41, 78, 118);
                    // 标题背景颜色
                    Color titleBackColor = new Color(147, 179, 225);
                    // 统计图中心区域颜色
                    Color cutlineColor = new Color(0, 128, 255, 50);
                    // 图例数据颜色
                    Color cutDataColor = Color.white;
                    Font titleFont = new Font("黑体", Font.BOLD, 18);
                    Font otherFont = new Font("宋体", Font.PLAIN, 12);
                    String year = "";
                    String month = "";
                    String day = "";
                    Graphics2D g2 = (Graphics2D) g;
                    RenderingHints hints = new RenderingHints(null);
                    hints.put(RenderingHints.KEY_ANTIALIASING,
                                    RenderingHints.VALUE_ANTIALIAS_ON);
                    g2.setRenderingHints(hints);
                    GradientPaint gradient = new GradientPaint(0, 0, BackStartColor, 0,
                                    400, BackLastColor, false);
                    g2.setPaint(gradient);
                    Rectangle2D rect = new Rectangle2D.Double(0, 0, width, height);
                    g2.fill(rect);
                    // 绘制标题背景
                    g2.setColor(titleBackColor);
                    g2.fill3DRect(0, 0, width, 30, true);
                    // 绘制图例区域背景
                    g2.setColor(cutlineColor);
                    g2.fillRect(cutlineRect_y, cutlineRect_x, cutlineRect_width,
                                    cutlineRect_heigth);
                    g2.setColor(Color.white);
                    g2.drawRect(cutlineRect_y, cutlineRect_x, cutlineRect_width,
                                    cutlineRect_heigth);
                    // 绘制统计图标题
                    g2.setFont(titleFont);
                    g2.setColor(titleColor);
                    g2.drawString(title, titleStart_y, titleStart_x);
                    // 显示绘制日期
                    year = Integer.toString(1900 + date.getYear());
                    month = Integer.toString(date.getMonth() + 1);
                    day = Integer.toString(date.getDate());
                    g2.drawString(year + "年" + month + "月" + day + "日", otherInfo_y3 + 60,
                                    otherInfo_x3);
                    // 显示数据百分比
                    int colorRectWH = 15;
                    int space = 5; // 图例中小色块之间的间隔距离
                    int addData = cutlineRect_x;
                    for (int i = 0; i < data.length; i++) {
                            g2.setColor(colors);
                            g2.fill3DRect(cutlineRect_y, addData, colorRectWH, colorRectWH,
                                            true);
                            if (data == max || data == min)
                                    g2.setColor(Color.red);
                            else
                                    g2.setColor(cutDataColor);
                            g2.drawString(String.valueOf(data) + "   (" + percent + ")",
                                            cutlineRect_y + 20, addData + colorRectWH - space);
                            addData += colorRectWH + space;
                    }
            }
            public void PaintChart(Graphics g) {
                    int start = 0;
                    int rVal = 192;
                    int gVal = 192;
                    int bVal = 192;
                    int frameCount = 60;
                    Graphics2D g2 = (Graphics2D) g;
                    RenderingHints hints = new RenderingHints(null);
                    hints.put(RenderingHints.KEY_ANTIALIASING,
                                    RenderingHints.VALUE_ANTIALIAS_ON);
                    g2.setRenderingHints(hints);
                    for (int t = 20; t >= 0; t--) {
                            rVal = t * 255 / frameCount;
                            gVal = t * 255 / frameCount;
                            bVal = t * 255 / frameCount;
                            g2.setColor(new Color(rVal, gVal, bVal, 50));
                            g2.drawOval(oval_x, oval_y + t, long_axes, short_axes);
                    }
                    for (int a = 0; a < data.length; a++) {
                            Arc2D arc = new Arc2D.Float(Arc2D.PIE);
                            g2.setColor(colors[a]);
                            arc.setFrame(oval_x, oval_y, long_axes, short_axes);
                            arc.setAngleStart(start);
                            arc.setAngleExtent(radian[a]);
                            g2.fill(arc);
                            if (data[a] == max || data[a] == min)
                                    g2.setColor(Color.white);
                            else
                                    g2.setColor(new Color(223, 223, 223, 150));
                            g2.draw(arc);
                            start += radian[a];
                    }
            }
            public static void main(String[] arsg) {
                    try {
                            CakeChart cake = new CakeChart();
                    } catch (Exception exe) {
                    }
            }
    }
            [/code]

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/9/235653312.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:26 , Processed in 0.353881 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表