红包类型:

  1. 普通红包:金额均分。不能整除的,余额添加到最后一份红包中。
  2. 手气红包:金额随机。各个红包金额累和与总金额相等。

​此案例是模拟群主给群成员发红包,群主自己打开最后一个红包的场景。

导入图片:将pic目录,导入项目中,与src 目录平级。

pic中有5张图片

01_input.jpg

02_open_1.jpg

02_open_2.gif

03_money_1.jpg

logo.gif

RedPacketFrame.java

package redpackage2;import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.HashMap;/*** 红包的框架 RedPacketFrame* <p>* 页面部分-- 包含三个页面 输入页面-- InputPanel 打开页面-- OpenPanel 展示页面-- ShowPanel** @author xiaoliguang*/
public abstract class RedPacketFrame extends JFrame {private static final long serialVersionUID = 1L;private ArrayList<Integer> moneyList = null;private static int initMoney = 0;private static int totalMoney = 0; // 单位为 "分"private static int count = 0;private static HashMap<JPanel, JLabel> panel_lable = new HashMap<JPanel, JLabel>();// 设置字体private static Font font_yahei = new Font("微软雅黑", Font.BOLD, 20);private static Font msg_font = new Font("微软雅黑", Font.BOLD, 20);private static Font total_show_font = new Font("微软雅黑", Font.BOLD, 40);private static Font name_font = new Font("微软雅黑", Font.BOLD, 40);private static Font showName_font = new Font("微软雅黑", Font.BOLD, 20);private static Font showMoney_font = new Font("微软雅黑", Font.BOLD, 50);private static Font showResult_font = new Font("微软雅黑", Font.BOLD, 15);/*** 窗体大小 WIDTH:400 HEIGHT:600*/private static final int FRAME_WIDTH = 416; // 静态全局窗口大小private static final int FRAME_HEIGHT = 650;private static JLayeredPane layeredPane = null;/// private static JPanel contentPane = null;/*** page1:输入页面 - InputPanel . 组件和初始化!*/private static JPanel inputPanel = new JPanel();// private static JTextField input_total = new JTextField("200"); // 测试用// private static JTextField input_count = new JTextField("3"); // 测试用private static JTextField input_total = new JTextField();private static JTextField input_count = new JTextField();private static JTextField input_people = new JTextField("30");private static JTextField input_msg = new JTextField("恭喜发财  ,  大吉大利");private static JTextField input_total_show = new JTextField("$ " + input_total.getText().trim());private static JLabel input_inMoney = new JLabel(); // 不可见private static JLabel input_bg_label = new JLabel(new ImageIcon("pic\\01_input.jpg"));static {// 设置位置input_total.setBounds(200, 90, 150, 50);input_count.setBounds(200, 215, 150, 50);input_people.setBounds(90, 275, 25, 30);input_msg.setBounds(180, 340, 200, 50);input_total_show.setBounds(130, 430, 200, 80);input_inMoney.setBounds(10, 535, 380, 65);input_bg_label.setBounds(0, 0, 400, 600); // 背景// 设置字体input_total.setFont(font_yahei);input_count.setFont(font_yahei);input_people.setFont(font_yahei);input_msg.setFont(msg_font);input_msg.setForeground(new Color(255, 233, 38)); // 字体颜色 为金色input_total_show.setFont(total_show_font);input_inMoney.setFont(font_yahei);// 透明input_people.setOpaque(false);input_total_show.setOpaque(false);// 编 辑 -- 不可编辑input_people.setEditable(false);input_total_show.setEditable(false);// 边界 -- 无input_total.setBorder(null);input_count.setBorder(null);input_people.setBorder(null);input_msg.setBorder(null);input_total_show.setBorder(null);}/*** page2:打开页面 - openPanel . 组件和初始化!*/private static JPanel openPanel = new JPanel();private static JTextField open_ownerName = new JTextField("谁谁谁谁");private static JLabel open_label = new JLabel(new ImageIcon("pic\\02_open_2.gif"));private static JLabel open_bg_label = new JLabel(new ImageIcon("pic\\02_open_1.jpg"));static {// 设置 位置.open_ownerName.setBounds(0, 110, 400, 50);open_bg_label.setBounds(0, 0, 400, 620);open_label.setBounds(102, 280, 200, 200);open_ownerName.setHorizontalAlignment(JTextField.CENTER);// 设置字体open_ownerName.setFont(name_font);open_ownerName.setForeground(new Color(255, 200, 163)); // 字体颜色 为金色// 背景色// open_name.setOpaque(false);open_ownerName.setBackground(new Color(219, 90, 68));// 不可编辑open_ownerName.setEditable(false);// 边框open_ownerName.setBorder(null);}/*** page3:展示页面 - showPanel . 组件和初始化!*/private static JPanel showPanel = new JPanel();private static JPanel showPanel2 = new JPanel();private static JScrollPane show_jsp = new JScrollPane(showPanel2);;private static JLabel show_bg_label = new JLabel(new ImageIcon("pic\\03_money_1.jpg"));private static JTextField show_name = new JTextField("用户名称");private static JTextField show_msg = new JTextField("祝福信息");private static JTextField show_money = new JTextField("99.99");private static JTextField show_result = new JTextField(count + "个红包共" + (totalMoney / 100.0) + "元,被抢光了");static {// 分别设置水平和垂直滚动条自动出现// jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);// jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);/** 两部分 页面 . 1.本人获得的红包-- showPanel 2.别人获得的红包-- show_jsp*/show_name.setBounds(125, 180, 100, 30);show_name.setOpaque(false);show_name.setBorder(null);show_name.setFont(showName_font);show_msg.setBounds(0, 220, 400, 30);show_msg.setOpaque(false);show_msg.setBorder(null);show_msg.setFont(msg_font);show_msg.setHorizontalAlignment(JTextField.CENTER);show_money.setBounds(0, 270, 250, 40);show_money.setOpaque(false);show_money.setBorder(null);show_money.setFont(showMoney_font);show_money.setForeground(new Color(255, 233, 38)); // 字体颜色 为金色show_money.setHorizontalAlignment(SwingConstants.RIGHT);show_result.setBounds(10, 460, 400, 20);show_result.setOpaque(false);show_result.setBorder(null);show_result.setFont(showResult_font);show_result.setForeground(new Color(170, 170, 170)); // 字体颜色 为灰色// 设置 图片.show_bg_label.setBounds(0, 0, 400, 500);}static {// 页面和 背景的对应关系.panel_lable.put(inputPanel, input_bg_label);panel_lable.put(openPanel, open_bg_label);panel_lable.put(showPanel, show_bg_label);}private void init() {// 层次面板-- 用于设置背景layeredPane = this.getLayeredPane();System.out.println("层次面板||" + layeredPane);// System.out.println(layeredPane);// 初始化框架 -- logo 和基本设置initFrame();// 初始化 三个页面 -- 准备页面initPanel();// 2.添加 页面 --第一个页面, 输入 panel 设置到 页面上.setPanel(inputPanel);// 3.添加 监听addListener();}/*** 初始化框架 -- logo 和基本设置*/private void initFrame() {// logothis.setIconImage(Toolkit.getDefaultToolkit().getImage("pic\\logo.gif"));System.out.println("LOGO初始化...");// 窗口设置this.setSize(FRAME_WIDTH, FRAME_HEIGHT); // 设置界面大小this.setLocation(280, 30); // 设置界面出现的位置this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setLayout(null);// 测试期 注释 拖 拽 , 运行放开// this.setResizable(false);this.setVisible(true);}/*** 初始化页面-- 准备三个页面*/private void initPanel() {System.out.println("页面初始化...");initInputPanel();initOpenPanel();initShowPanel();}private void initInputPanel() {inputPanel.setLayout(null);inputPanel.setBounds(0, -5, 400, 600);// this.add(bg_label);inputPanel.add(input_total);inputPanel.add(input_count);inputPanel.add(input_people);inputPanel.add(input_msg);inputPanel.add(input_total_show);inputPanel.add(input_inMoney);System.out.println("输入页面||" + inputPanel);}private void initOpenPanel() {openPanel.setLayout(null);openPanel.setBounds(0, 0, 400, 600);// this.add(bg_label);openPanel.add(open_ownerName);openPanel.add(open_label);System.out.println("打开页面||" + openPanel);}private void initShowPanel() {showPanel.setLayout(null);showPanel.setBounds(10, 10, 300, 600);// ==============showPanel.add(show_name);showPanel.add(show_msg);showPanel.add(show_money);showPanel.add(show_result);System.out.println("展示页面||" + showPanel);// ====================================// showPanel2.setLayout(null);// showPanel2.setBounds(0, 500, 401, 300);showPanel2.setPreferredSize(new Dimension(300, 1000));showPanel2.setBackground(Color.white);show_jsp.setBounds(0, 500, 400, 110);}/*** 每次打开页面, 设置 panel的方法*/private void setPanel(JPanel panel) {// 移除当前页面layeredPane.removeAll();System.out.println("重新设置:新页面");// 背景lable添加到layeredPane的默认层layeredPane.add(panel_lable.get(panel), JLayeredPane.DEFAULT_LAYER);// 面板panel设置为透明panel.setOpaque(false);// 面板panel 添加到 layeredPane的modal层layeredPane.add(panel, JLayeredPane.MODAL_LAYER);}// private void setShowPanel(JPanel show) {// setPanel(show);// layeredPane.add(show_jsp, JLayeredPane.MODAL_LAYER);//// }/*** 设置组件的监听器*/private void addListener() {/*** inputPanel*/input_total.addKeyListener(new KeyAdapter() {@Overridepublic void keyReleased(KeyEvent e) {// System.out.println(e);String input_total_money = input_total.getText();input_total_show.setText("$ " + input_total_money);}});input_count.addKeyListener(new KeyAdapter() {@Overridepublic void keyReleased(KeyEvent e) {// System.out.println(e);System.out.println("个数:" + input_count.getText());}});input_msg.addKeyListener(new KeyAdapter() {@Overridepublic void keyReleased(KeyEvent e) {// System.out.println(e);System.out.println("留言:" + input_msg.getText());}});input_inMoney.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {try {// 获取页面的值.totalMoney = (int) (Double.parseDouble(input_total.getText()) * 100); // 转换成"分"count = Integer.parseInt(input_count.getText());if (count > 30) {JOptionPane.showMessageDialog(null, "红包个数不得超过30个", "红包个数有误", JOptionPane.INFORMATION_MESSAGE);return;}initMoney = totalMoney;System.out.println("总金额: " + totalMoney + " 分");System.out.println("红包个数: " + count);input_inMoney.removeMouseListener(this);System.out.println("跳转-->打开新页面");// 设置群主名称open_ownerName.setText(ownerName);// 设置打开页面setPanel(openPanel);} catch (Exception e2) {JOptionPane.showMessageDialog(null, "请输入正确【总金额】或【红包个数】", "输入信息有误", JOptionPane.ERROR_MESSAGE);}}});/*** open_ownerName ,点击 [名称],触发的方法 , 提示如何设置群主名称.*/open_ownerName.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent arg0) {JOptionPane.showMessageDialog(null, "请通过【setOwnerName】方法设置群主名称", "群主名称未设置",JOptionPane.QUESTION_MESSAGE);}});/*** open label , 点击 [开],触发的方法,提示如何设置打开方式.*/open_label.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {if (openWay == null) {JOptionPane.showMessageDialog(null, "请通过【setOpenWay】方法设置打开方式", "打开方式未设置",JOptionPane.QUESTION_MESSAGE);return;}System.out.println("跳转-->展示页面");moneyList = openWay.divide(totalMoney, count);System.out.println(moneyList);/** showPanel 添加数据**/show_name.setText(ownerName);show_msg.setText(input_msg.getText());if (moneyList.size() > 0) {show_money.setText(moneyList.get(moneyList.size() - 1) / 100.0 + "");}show_result.setText(count + "个红包共" + (initMoney / 100.0) + "元,被抢光了");open_label.removeMouseListener(this);setPanel(showPanel);// 添加数据for (int i = 0; i < moneyList.size(); i++) {JTextField tf = new JTextField();tf.setBorder(null);tf.setFont(showName_font);tf.setHorizontalAlignment(JTextField.LEFT);if (i == moneyList.size() - 1) {tf.setText(ownerName + ":\t" + moneyList.get(i) / 100.0 + "元");} else {tf.setText("群成员 " + i + ":\t" + moneyList.get(i) / 100.0 + "元");}showPanel2.add(tf);}layeredPane.add(show_jsp, JLayeredPane.MODAL_LAYER);}});}/* ======================================================================* *********************************************************************** * 以上代码均为页面部分处理,包括布局/互动/跳转/显示等,大家                           ** *                                                                    ** *                                                                    ** *********************************************************************** ======================================================================*//*** ownerName : 群主名称*/public String ownerName = "谁谁谁谁"; // 群主名称/*** openWay : 红包的类型 [普通红包/手气红包]*/public OpenMode openWay = null;/*** 构造方法:生成红包界面.** @param title 页面的标题.*/public RedPacketFrame(String title) {super(title);// 页面相关的初始化init();}public void setOwnerName(String ownerName) {this.ownerName = ownerName;}public void setOpenWay(OpenMode openWay) {this.openWay = openWay;}}

OpenMode.java

package redpackage2;import java.util.ArrayList;public interface OpenMode {ArrayList<Integer> divide(int totalMoney, int count);
}

RedPacket.java

package redpackage2;import redpackage2.RedPacketFrame;public class RedPacket extends RedPacketFrame {/*** 构造方法:生成红包界面.** @param title 页面的标题.*/public RedPacket(String title) {super(title);}
}

Common.java

package redpackage2;import redpackage2.OpenMode;import java.util.ArrayList;public class Common implements OpenMode {@Overridepublic ArrayList<Integer> divide(int totalMoney, int count) {// 创建保存各个红包金额的集合ArrayList<Integer> list = new ArrayList<>();// 定义循环次数,总个数-1次int time = count - 1;// 一次计算,生成平均金额int money = totalMoney / count;// 循环分配for (int i = 0; i < time; i++) {// 添加到集合中list.add(money);// 总金额扣除已分配金额totalMoney -= money;}// 剩余的金额,为最后一个红包list.add(totalMoney);System.out.println("普通红包金额:" + list);// 返回集合return list;}
}
  1. 手气红包【重点】

本质上,手气红包就是把总金额totalMoney 随机分成指定的count份,所以必须规定每一份金额的取值范围。如果范围太小,可能导致后分配红包金额特别大。反之范围太大,可能导致后分配红包金额为0,不够分。可见,取值范围的定义规则,是手气红包的关键所在。

我们规定:每一份随机金额范围(除最后一份),最小值为1,最大值为当前剩余平均金额的2倍 ,单位为"分"。

计算公式:

当前剩余平均金额 = 剩余总金额 / 剩余红包个数

举例:总额为50元,发5个红包。

当前剩余平均金额(取整数) 红包范围 随机金额(假设)
第一个红包 50 / 5 = 10 0.01~20 5
第二个红包 45 / 4 = 11 0.01~22 20
第三个红包 25 / 3. = 8 0.01~16 10
第四个红包 15 / 2 = 7 0.01~14 12
第五个红包(最后一个) 无需计算 剩余金额 3

小贴士:为方便表格中进行运算,此处,单位为"元"。程序中,建议换算为"分"进行运算。

Lucky.java

package redpackage2;import java.util.ArrayList;
import java.util.Random;public class Lucky implements OpenMode{@Overridepublic ArrayList<Integer> divide(int totalMoney, int count) {// 创建保存各个红包金额的集合ArrayList<Integer> list = new ArrayList<>();// 定义循环次数,总个数-1次int time = count - 1;// 创建随机数对象Random random = new Random();// 循环分配for (int i = 0; i < time; i++) {/** 每次重新计算,生成随机金额* 随机范围: totalMoney / count * 2,totalMoney不断的减少,* count也不断的减少,所以这是一个可变化的范围.*/int money = random.nextInt(totalMoney / count * 2) + 1;// 金额添加到集合list.add(money);// 总金额扣除已分配金额totalMoney -= money;// 红包个数-1count--;}// 剩余的金额,为最后一个红包list.add(totalMoney);return list;}
}

RedPacketTest.java

package redpackage2;public class RedPacketTest {public static void main(String[] args) {RedPacket redPacket = new RedPacket("Big红包");redPacket.setOwnerName("群猪");//redPacket.setOpenWay(new Common());//一般红包redPacket.setOpenWay(new Lucky()); // 手气红包}
}

执行效果



发红包小程序最终版(趣味)相关推荐

  1. 实现中英文对接翻译小程序—最终版

    实现中英文对接翻译小程序-最终版 在原有界面上增加了新的标签和按钮 #encoding=utf-8 import json import requests import sys from tkinte ...

  2. python发红包小程序_小程序红包雨

    前言 话不多少先上效果,引入很简单,将/components/s-packetrain/index放到你的组件文件夹中 直接引用就可以了. 首先你要先在页面引入组件 index.json 引用组件 { ...

  3. 包你说语音红包小程序运营版

    简介: 包你说微信语音口令红包运营版 修复市面已知BUG,完全开源,支持二次开发. 网盘下载地址https://www.skpan.cn/kYS44EJWFn5 图片:

  4. 小程序源码:2022强大的修复版趣味心理测试小程序源码,趣味测试引流裂变神器

    大家还记得以前有一款趣味测嚒? 那款趣味测试可以说在当时是只要当时做小程序的基本是人手一款 不过后来自从腾讯更新小程序登录接口以后,那款小程序也就和接口一起挂了 那么呢现在小编就给大家发布修复过的,修 ...

  5. 微信小程序:2022强大的修复版趣味心理测试小程序源码,趣味测试引流裂变神器,流量主激励广告实现管道收益

    大家还记得以前有一款趣味测嚒? 那款趣味测试可以说在当时是只要当时做小程序的基本是人手一款 不过后来自从腾讯更新小程序登录接口以后,那款小程序也就和接口一起挂了 那么呢现在小编就给大家发布修复过的,修 ...

  6. 小程序源码:2022强大的修复版趣味心理测试小程序源码,趣味测试引流裂变神器-多玩法安装简单

    大家还记得以前有一款趣味测嚒? 那款趣味测试可以说在当时是只要当时做小程序的基本是人手一款 不过后来自从腾讯更新小程序登录接口以后,那款小程序也就和接口一起挂了 那么呢现在小编就给大家发布修复过的,修 ...

  7. 2023最新包你说语音口令红包小程序源码+运营版/修复BUG完全开源

    正文: 包你说语音口令红包小程序源码运营版,修复市面已知BUG,完全开源,支持二次开发,有兴趣的自行去安装体验吧,其它就没什么好介绍的了. 程序: wwtyeo.lanzoux.com/i2k0i0s ...

  8. 图书云小程序体验版1.0.1发布

    图书云小程序体验版1.0.1发布 ,关注公众号[图书云]即可通过菜单进入小程序! 图书云为共享图书平台,向附近的朋友借书.同事.群友.俱乐部好友借书!图书云让小伙伴们享受便捷的移动图书馆服务,每个人都 ...

  9. 微信小程序红包开发思路 微信红包小程序开发思路讲解

    之前公司开发小程序红包,将自己在开发的过程中遇到的一些坑分享到了博客里.不少人看了以后,还是不明白怎么开发.也加了我微信咨询.所以今天,我就特意再写一篇文章,这次就不谈我开发中遇到的坑了.就主要给大家 ...

最新文章

  1. c语言三目运算错误,c语言中三目运算符有什么用
  2. RMAN 备份SHELL
  3. EEPlat的元模型体系
  4. api数据库管理_API管理平台如何增强您的数据科学项目
  5. jsp javabean mysql_jsp mysql JavaBean
  6. 网络爬虫之java基础(Ⅰ)
  7. 【物联网智能网关-08】TinyGUI和WPF汉字显示技术比较
  8. 关于破解百度文库的方法(非常实用)
  9. oracle字段类型number默认值,Oracle 字段类型 | 学步园
  10. Python小白基础--集合set
  11. 保龄球 java机试题
  12. 幂数加密(云影加密)
  13. 还原《魔兽争霸3》场景全过程
  14. 群晖NAS的公网、NAT、DDNS、证书等配置三
  15. 【高级微观经济学】利润最大化
  16. 用javascript计算PPI
  17. 工业控制系统的安全建议
  18. 计算机考研考线代和概率论吗,2018考研数学各章节考点汇总(高数+线代+概率论)...
  19. 考研:研究生考试(七天学完)之《概率与统计》研究生学霸重点知识点总结之考试内容各科占比及常考知识重点梳理(随机事件和概率、一维随机变量及其分布、多维随机变量及其分布、随机变量的数字特征、大数定律和中心
  20. solidity 测试用的一些工具包

热门文章

  1. 汉明距离(Hamming Distance)
  2. (七):Statistics统计工具功能详解与应用
  3. C51---蓝牙模块---连接软件---控制LED灯
  4. ChatGPT之导航博客架构
  5. VMware EXSI 配置两个网卡(外网和内网)
  6. Oracle 增加表空间
  7. JAVASCRIPT---CSS过渡-Transitions
  8. 为什么童话大王郑渊洁不让儿子上学
  9. Codeforces 1077D Cutting Out
  10. 大型网站架构之大型网站核心架构要素