YourBatman用趣味代码雨祝你:端午安康

简介: 使用Java的AWT给你写了个祝福

在这里插入图片描述

如图,这是笔者第40天居家办公,40天如一日 = 一本Mac + 一台显示器 + 一个手机 + 一杯枸杞茶 + Zoom + Hue + Excel + IDEA + Wechat,愿阴霾早日散去,god bless!

你好,我是方向盘(YourBatman)

📚前言

今天是2022年的6月3日,端午节,祝大家端午安康

端午节(也叫粽子节)与春节、清明节、中秋节并称为中国民间四大传统节日,一直延续至今。
在这里插入图片描述
作为一枚程序员,本文用Java代码这种“趣味的”方式写出笔者对大家的祝福语,还请笑纳。

✍正文

Java大都用来作为服务器开发,殊不知它也可以用作客户端开发,并且能做出“漂亮的UI”,比如Javaer最最最常用的IDE:IntelliJ IDEA,以及Eclipse,它们都是用Java语言绘制而成的UI。

🌈Java图形化界面编程

首先需要明确:Java开发UI的技术,是很少使用的技术,所以这里只稍微介绍一下。

前端页面三剑客(CSS + JS + Html)牢牢占据UI的主导地位,无可撼动

AWT和Swing都可以完成图形化界面编程。前者较老,后者较新用于替代前者。

🚀AWT

AWT(Abstract Window Toolkit)意思是:抽象窗口具集,它是Sun公司最早提供的GUI库,在JDK 1.0版本就有提供。

GUI(Graphical User Interface): 图形用户界面,是指采用图形方式显示的计算机操作用户界面

AWT是通过调用操作系统的native方法实现的,所以在Windows系统上的AWT窗口就是Windows的风格,而在Unix系统上的则是XWindow风格,做到了“自适应”。因为AWT是依靠本地方法来实现功能的,所以AWT控件称为“重量级控件”。

🚀Swing

Swing是Java设计的新一代GUI工具包,它的出现旨在解决AWT组件的移植性问题,同时提供更多的企业级应用程序所需要的界面功能。Swing类库被包含在JDK 1.2及以后版本中,类主要在javax.swing包里。

Swing不仅提供的AWT的所有功能,还用纯粹的Java代码(并非native调用)对AWT的功能进行了大幅度的扩充,例如:树形控件不是所有操作系统都支持,但使用Swing就可以无视操作系统。

  • 由于Swing是用Java实现而非native方法实现,因此具有完美的跨平台特性
  • 由于Swing不适用native方法,所以相较于AWT也被称作“轻量级控件”

🌈祝:端午安康

你开发了祝福的程序,
你安装了虚拟的系统,
你设置了幸福的密码,
你下载了流畅的软件,
端午节到了,
愿你有个快乐的心情。

你从智慧中开发财富,
你从勤奋中耕耘成就,
你从耐心中创造艺术,
你从工作中寻找生活,
端午节到了,
愿你编出精彩的人生。

你用命令开启了精彩,
你用效率创造了价值,
你用冷静判断了是非,
你用可观展示了结果,
端午节到了,
愿你码出高效的代码。

🚀效果图

在这里插入图片描述

🚀资源下载

资源已上传至CSDN,免费下载。下载后直接执行java -jar codeRainApp.jar即可看到效果。
在这里插入图片描述

下载地址:https://download.csdn.net/download/f641385712/85537537

🚀源代码获取

其实就两个类,笔者都贴出来了哈,有需要的自取

CodeRainMain

/**
 * 程序入口
 *
 * @author YourBatman. <a href=mailto:yourbatman@aliyun.com>Send email to me</a>
 * @site https://yourbatman.cn
 * @date 2022/6/3 16:50
 * @since 0.0.1
 */
public class CodeRainMain {

    public static void main(String[] args) throws IOException {
        // 读取端午节祝福语文案
        List<String> lines = IOUtils.readLines(new ClassPathResource("duanwujie.txt").getInputStream(), UTF_8);

        // ========== 读取到文案后,开始展示 =========
        Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
        int width = (int) (screensize.getWidth() * 0.85); // 笔记本一般是1440
        int height = (int) (screensize.getHeight() * 0.85); // 笔记本一般是900
        System.out.println(format("屏幕大小为:width:%s height:%s", width, height));

        JFrame frame = new JFrame("YourBatman祝:端午安康");
        CodeRainJPanel panel = new CodeRainJPanel(lines); // 自定义的代码雨面板对象

        frame.add(panel); // 将面板添加到JFrame中
        frame.setSize(width, height); // 设置窗口大小
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null); // 窗体居中显示
        frame.setVisible(true); // 尽快调用paint

        panel.start();
        panel.requestFocus();
    }
}

CodeRainJPanel

/**
 * 代码雨面板
 * <p>Panel是Java图形用户界面(GUI)工具包swing中的【面板】容器类</p>
 *
 * @author YourBatman. <a href=mailto:yourbatman@aliyun.com>Send email to me</a>
 * @site https://yourbatman.cn
 * @date 2022/6/3 11:12
 * @since 0.0.1
 */
public class CodeRainJPanel extends JPanel {


    private static final int FONT_SIZE = 33; // 字体大小
    private static final int SPACE = 40; // 字间距
    private static final int SLEEP_TIME = 130; // 休眠时间(ms),可以尽量慢点

    private String[][] charsetArray; // 字符集合(可从文件、外部配置读取),二位数组
    private int[] pos; // 列的起始位置
    private Color[] colors = new Color[10]; //列的渐变颜色

    private List<String> surceLines; // 数据源:按行读取

    public CodeRainJPanel(List<String> surceLines) {
        this.surceLines = surceLines;
    }

    /**
     * 按行随机输出
     */
    private void randomFromSourceLines(String[] charset) {
        int lineCount = this.surceLines.size();

        int length = 0;
        int destPos = 0;
        while (true) {
            int index = ThreadLocalRandom.current().nextInt(lineCount);
            String line = surceLines.get(index); // 从所有行中随机取一行
            String[] lineArray = line.split(""); // 将这一行打散成一个个的字

            boolean breakFlag;
            if (lineArray.length + destPos >= charset.length) {
                length = charset.length - destPos;
                breakFlag = true;
            } else {
                length = lineArray.length;
                breakFlag = false;
            }

            System.arraycopy(lineArray, 0, charset, destPos, length); // 放进charset里
            destPos += length;
            if (breakFlag) {
                break;
            }
        }
    }

    public void init() {
        int width = getWidth(); // 屏幕宽度
        int height = getHeight(); // 屏幕高度

        charsetArray = new String[width / SPACE][height / SPACE];
        for (int i = 0; i < charsetArray.length; i++) {
            randomFromSourceLines(charsetArray[i]);
        }

        //随机化列起始位置
        pos = new int[charsetArray.length];
        for (int i = 0; i < pos.length; i++) {
            pos[i] = ThreadLocalRandom.current().nextInt(1000);
        }

        // 生成渐变色:生成从黑色到绿色的渐变颜色
        for (int i = 0; i < colors.length - 1; i++) {
            colors[i] = new Color(0, 180 / colors.length * (i + 1), 0);
            // colors[i] = new Color(0, 255 / colors.length * (i + 1), 0);
        }

        // 背景颜色
        setBackground(Color.BLACK);
    }

    public void start() {
        init();
        new Thread(() -> {
            while (true) {
                try {
                    repaint(); // 重绘,调用paint()方法
                    Thread.sleep(SLEEP_TIME); // 停一会,继续重回,达到一闪一闪的效果
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }).start();

        // 按键盘的任意箭退出
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                System.exit(0);
            }
        });
//        addMouseListener(new MouseAdapter() {
//            @Override
//            public void mousePressed(MouseEvent e) {
//                System.exit(0);
//            }
//        });
    }


    @Override
    public void paint(Graphics g) {
        //必须设置,否则setBackground(Color.BLACK); 设置背景色无效
        super.paint(g);

        Graphics2D g2 = (Graphics2D) g;// 转换为Graphics2D类型
        g2.setFont(new Font("华文行楷", Font.BOLD, FONT_SIZE));

        for (int i = 0; i < charsetArray.length; i++) {
            for (int j = 0; j < colors.length; j++) {
                int index = (pos[i] + j) % charsetArray[i].length;

//                int R = ThreadLocalRandom.current().nextInt(128);// 随机产生颜色的R值
//                int G = ThreadLocalRandom.current().nextInt(256);// 随机产生颜色的G值
//                int B = ThreadLocalRandom.current().nextInt(256);// 随机产生颜色的B值
//                g2.setColor(new Color(R, G, B));

                 g2.setColor(colors[j]); // 纯黑色,黑客帝国的感觉,不够喜庆
                g2.drawString(charsetArray[i][index], i * SPACE, (index + 1) * SPACE);

            }
            pos[i] = (pos[i] + 1) % charsetArray[i].length;
//            if(pos[i]==0){
//                random(charset[i]);
//            }
        }
    }

}

🍞总结

端午节是咱中国四大传统节日之一,重要性“仅次于”春节。在互联网领域大环境不好的情况下,程序员越来越卷,下班时间越来越晚,赚钱的同时也要保重身体,YourBatman在此祝你端午安康

目录
相关文章
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错之使用oracle-cdc的,遇到错误:ORA-01292: no log file has been specified for the current LogMiner session,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
自然语言处理 算法 编译器
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
1022 0
|
算法
以太网CSMA/CD协议:通信原理、碰撞检测与退避机制深度解析
以太网CSMA/CD协议:通信原理、碰撞检测与退避机制深度解析
1789 1
|
大数据 流计算
大数据-108 Flink 快速应用案例 重回Hello WordCount!方案1批数据 方案2流数据(二)
大数据-108 Flink 快速应用案例 重回Hello WordCount!方案1批数据 方案2流数据(二)
129 0
|
算法 Python
SMOTE
【6月更文挑战第26天】
413 1
|
缓存 负载均衡 安全
介绍一下Nginx的反向代理功能吧
【8月更文挑战第22天】介绍一下Nginx的反向代理功能吧
227 0
|
弹性计算 物联网 网络性能优化
MQTT常见问题之connection reset by peer 异常如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
Windows Linux 网络安全
windows 上rsync客户端使用方法
1.1 获取 windows上实现rsync的软件(cwRsync) cwRsync是Windows 客户端GUI的一个包含Rsync的包装。您可以使用cwRsync快速远程文件备份和同步。 1.
9712 0
windows 上rsync客户端使用方法
|
Java Linux 应用服务中间件
Linux系统CentOS 7配置Spring Boot运行环境
从阿里云新买的一台Linux服务器,用来部署SpringBoot应用,由于之前一直使用Debian版本,环境配置有所不同,也较为繁琐,本文主要介绍CentOS下配置SpringBoot环境的过程 新建用户 由于新拿到的机器只有root用户,用root用户直接进行各种操作会有一定的安全问题,所以我们先创建用户。
5809 0
|
缓存 算法 安全
[译] OpenSSL 3.0.0 设计
本文翻译 OpenSSL 官网文档:https://www.openssl.org/docs/OpenSSL300Design.htmlTongsuo-8.4.0 是基于 OpenSSL-3.0.3 开发,所以本文对 Tongsuo 开发者同样适用,内容丰富,值得一读!介绍本文概述了 OpenSSL 3.0 的设计,这是在 1.1.1 版本之后的 OpenSSL 的下一个版本。假设读者熟悉名为 &
290 0
[译] OpenSSL 3.0.0 设计