Java 2022圣诞树+2023元旦倒计时打包一起领走

news2024/11/26 4:42:35

在这里插入图片描述

2022最后一个月充满了期待,平安夜、圣诞节、元旦节;2023年也是一个早年,因此关于程序方面的浪漫,大家应该趁早准备。下面我将分享一个元旦的倒计时和圣诞树的绘制核心代码。大家可以依据自身的需求,稍微调整即可用。

2022 圣诞树

下载地址:Java200行代码画了三种浪漫的圣诞树的实例代码-Java文档类资源-CSDN下载

效果如下:

如何用纯Java语言,200行代码,画三种不同的“圣诞树”,直接使用Graphics2D进行绘制一层树层,然后封装成组件可以重复使用。最后把几个树层堆积起来,添加上树干就完成啦!但是勇哥写的程序永远没那么简单,我还在树上填充了积雪、或者直接把整颗树填充成你女朋友的名字,浪漫一把! 此程序你值得拥有,你可以用来:

- 向你女朋友制造浪漫圣诞 - 用来学习高级绘画API 总体支持的功能有:

- 支持纯绿模式

- 支持绿色+白色积雪模式

- 支持绿色+白色积雪+你女朋友名字模式

- 支持层数的自定义修改 - 程序内置一个动画彩蛋,谁用谁知道牛逼!

从此案例中你能学习到什么:

- 能学习到高级轮廓(比如树)的纯代码绘制

- 能学习到不规则图形,如何进行纹理填充

- 能学习到面向对象的高级编程思想

 参考代码:

package com.madou.yy.turnover;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import java.awt.image.*;
import java.util.Random;
// 圣诞树核心代码
public class TreeLeafPanel extends JPanel implements Runnable {
    Color color = new Color(0, 208, 158);
    int margin = 5 ;
    Stroke stroke = new BasicStroke(2);
    String text = "向日葵";
    /**
     * 0 = 不填充
     * 1 = 线程动态填充
     * 2 = 文字
     */
    int fillType = 0;

    public TreeLeafPanel(int fillType){
        this.fillType=fillType;
        this.setLayout(null);
        this.setOpaque(false);
    }

    public void paintComponent(Graphics g) {
        if(image==null) {
            initialize();
        }
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setPaint(color);
        g2d.setStroke(stroke);

        int leftY= (int) (getHeight()-margin-getHeight()*0.3);
        int step = (getWidth()-margin*2)/32;
        System.out.println(step);

        GeneralPath polygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD);
        polygon.moveTo(getWidth()/2,margin);
        polygon.quadTo(getWidth()/2-5,margin+(leftY-margin)*3/5,margin,leftY);
        for (int i = 1; i < 6; i++) {
            polygon.quadTo(margin+step*i*3,leftY,margin+step*i*3,leftY-3);
            polygon.quadTo(margin+step*i*3,leftY+3,margin+step*(i*3-1),leftY+step*2-(6-i));
        }
        for (int i = 6; i < 10; i++) {
            polygon.quadTo(margin+step*i*3,leftY,margin+step*i*3,leftY-3);
            polygon.quadTo(margin+step*i*3,leftY+3,margin+step*(i*3+4),leftY+step*2-(7-i));
        }
        polygon.quadTo(getWidth()/2+5,margin+(leftY-margin)*3/5,getWidth()/2,margin);
        polygon.closePath();
        Rectangle2D bounds2D = polygon.getBounds2D();
        if(image!=null) {
            TexturePaint texture = new TexturePaint(image, bounds2D);
            g2d.setPaint(texture);
        }
        g2d.fill(polygon);
        g2d.setColor(Color.BLACK);
        g2d.draw(polygon);
    }

    byte[] data;

    BufferedImage image;

    Random random;

    public void initialize() {
        random = new Random();
        int w = getSize().width, h = getSize().height;
        int length = ((w + 7) * h) / 8;
        data = new byte[length];
        imageFactory();
        if(fillType==1) {
            new Thread(this).start();
        }
    }

    public void imageFactory(){
        if(fillType==0){
            image = null;
        }else if(fillType==1){
            imageBW();
        }else{
            imageName();
        }
    }

    public void imageBW(){
        int w = getSize().width, h = getSize().height;
        int length = ((w + 7) * h) / 8;
        data = new byte[length];
        DataBuffer db = new DataBufferByte(data, length);
        WritableRaster wr = Raster.createPackedRaster(db, w, h, 1, null);
        ColorModel cm = new IndexColorModel(1, 2,
                new byte[] { (byte) 255, (byte) 0 },
                new byte[] { (byte) 255, (byte) 208 },
                new byte[] { (byte) 255, (byte) 158 });
        if(image==null) {
            image = new BufferedImage(cm, wr, false, null);
        }
    }

    public void imageName(){
        int w = getSize().width, h = getSize().height;
        if(image==null) {
            image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        }
        Graphics2D g2d = image.createGraphics();
        g2d.setColor(color);
        g2d.fillOval(0,0,w,h);
        Rectangle2D rectangle = g2d.getFont().getStringBounds(text, g2d.getFontRenderContext());
        for (int i = 0; i < w; i+=rectangle.getWidth()+5) {
            for (int j = 0;j< h; j+=rectangle.getHeight()+5) {
                g2d.setPaint(Color.WHITE);
                g2d.drawString(text,i,j);
            }
        }
        g2d.dispose();
    }

    public void run() {
        while (true) {
            random.nextBytes(data);
            repaint();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) { /* die */
            }
        }
    }

}

 2023元旦倒计时

下载地址:java版卡通元旦倒计时程序-新时间API学习好案例-Java文档类资源-CSDN下载

效果演示:

使用纯java+swing技术,来实现的《元旦倒计时》程序,界面卡通漂亮,另程序支持的功能如下: - 通用元旦倒计时,今年能用、明年也能用

- 支持生肖显示 - 支持农历显示 - 支持天干地支显示

- 支持倒计时显示 代码特点:基于Jdk1.8的新时间操作类进行开发,对于大家学习新时间API大有帮助。

【时间API】

- LocalDate

- LocalDateTime

- ChineseDate

- Duration

【SwingAPI】

- 自定美化组件样式

- 实线+虚线的绘制

- 多边形+圆角矩形绘制

- 动态文字的动态大小计算

【多线程】

- 如何使用多线程进行倒计时+swing界面刷新

 参考代码:

package com.madou.yy.newyear;

import cn.hutool.core.date.ChineseDate;

import javax.swing.*;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.geom.QuadCurve2D;
import java.awt.geom.Rectangle2D;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;

public class TimePanel extends JPanel implements Runnable {
    Color bgColor0 = new Color(242, 173, 46);
    Color bgColor1 = new Color(243, 210, 91);
    Color bgColor2 = new Color(253, 233, 133);
    Color bgColor3 = new Color(194, 112, 41);
    Color bgColor4 = new Color(246, 234, 181);
    Color lineColor = bgColor3;
    Stroke stroke = new BasicStroke(2);
    Stroke stroke2 = new BasicStroke(2,BasicStroke.CAP_SQUARE,BasicStroke.JOIN_MITER,1.0f,new float[]{6F},10f);

    Color font1 = Color.RED;
    Color font2 = new Color(129, 121, 82);
    Color font3 = new Color(44, 33, 14);
    String title1 = "",title2="",nong="",dao="";

    public void paintComponent(Graphics g) {
        // 设置抗锯齿
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        // 最底层背景
        g2d.setColor(bgColor0);
        g2d.fillRect(0,0,getWidth(),getHeight());
        // 第2层背景
        g2d.setColor(bgColor1);
        g2d.fillRoundRect(20,5,getWidth()-40,getHeight()-60,10,10);
        // 第2层背景边框
        g2d.setStroke(stroke);
        g2d.setColor(Color.BLACK);
        g2d.drawRoundRect(20,5,getWidth()-40,getHeight()-60,10,10);
        // 多边形
        int px[] = new int[]{10,50,getWidth()-10,getWidth()-10,10,10,};
        int py[] = new int[]{35,15,15,getHeight()-45,getHeight()-45,35};
        g2d.setColor(bgColor2);
        g2d.fillPolygon(px,py,px.length-1);// 多边形填充
        g2d.setColor(Color.BLACK);
        g2d.drawPolyline(px,py,px.length);// 多边形边
        // 深色 第3层背景+线
        g2d.setColor(bgColor3);
        g2d.fillRoundRect((int)(getWidth()*0.25),8,(int)(getWidth()*0.5),100,10,10);
        g2d.drawRoundRect((int)(getWidth()*0.25),8,(int)(getWidth()*0.5),100,10,10);
        // 第4层背景+虚线
        g2d.setColor(bgColor4);
        g2d.fillRoundRect(40,45,getWidth()-80,getHeight()-110,12,12);
        g2d.setStroke(stroke2);
        g2d.setColor(lineColor);
        g2d.drawRoundRect(40,45,getWidth()-80,getHeight()-110,12,12);
        // 绘制文字 第一排
        Font font = new Font("微软雅黑",Font.BOLD,36);
        g2d.setColor(font1);
        g2d.setFont(font);
        Rectangle2D title1Bounds = font.getStringBounds(title1, g2d.getFontRenderContext());
        g2d.drawString(title1,(int)(getWidth()-title1Bounds.getWidth())/2,100);
        // 绘制文字 第二排:农历
        font = new Font("微软雅黑",Font.BOLD,18);
        g2d.setColor(font2);
        g2d.setFont(font);
        Rectangle2D nongBounds = font.getStringBounds(nong, g2d.getFontRenderContext());
        g2d.drawString(nong,(int)(getWidth()-nongBounds.getWidth())/2,150);
        // 绘制文字 第三排
        font = new Font("微软雅黑",Font.BOLD,18);
        g2d.setColor(font2);
        g2d.setFont(font);
        Rectangle2D title2Bounds = font.getStringBounds(title2, g2d.getFontRenderContext());
        g2d.drawString(title2,(int)(getWidth()-title2Bounds.getWidth())/2,200);
        // 绘制文字 第四排 倒计时
        font = new Font("微软雅黑",Font.BOLD,48);
        g2d.setColor(font3);
        g2d.setFont(font);
        Rectangle2D daoBounds = font.getStringBounds(dao, g2d.getFontRenderContext());
        g2d.drawString(dao,(int)(getWidth()-daoBounds.getWidth())/2,280);
    }

    @Override
    public void run() {
        LocalDate localDate = LocalDate.now();
        localDate = localDate.plusYears(1).withMonth(1).withDayOfMonth(1);
        LocalDateTime localDateTime = localDate.atTime(0, 0, 0, 0);
        while (true){
            ChineseDate chineseDate = new ChineseDate(localDate);
            title1 = String.format("%s %s 年元旦倒计时",localDate.getYear(),chineseDate.getChineseZodiac());
            nong = String.format("元旦时间:%s 农历%s%s %s %s",
                    localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")),
                    chineseDate.getChineseMonthName(),
                    chineseDate.getChineseDay(),
                    localDate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.CHINESE),
                    chineseDate.getCyclicalYMD()
            );
            title2 = String.format("目前距离%s年元旦还有",localDate.getYear());
            Duration duration = Duration.between( LocalDateTime.now(),localDateTime);
            dao =String.format("%s天%s时%s分%s秒",
                    duration.toDays(),
                    duration.toHours()%24,
                    duration.toMinutes()%60,
                    duration.getSeconds()%60
                    );
            try {
                repaint();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void start() {
        new Thread(this).start();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

振弦渗压计怎样安装?振弦式渗压计工作原理

振弦渗压计是一种长期测量混凝土或地基内的孔隙(渗透)水压力&#xff0c;并可同步测量埋设点温度。适用于大坝工程安全监测、尾矿库工程安全监测、各类公路、桥梁、隧洞安全监测、土工建筑物基坑安全监测等。    1、设备介绍 通过不断的生产工艺技术的积累&#xff0c;采用…

vscode给docker内部的的ros工程代码打断点

背景 打断点debug虽然不能直观看到变量在时间轴上的整体变化曲线&#xff0c;但是其针对某一帧问题数据&#xff0c;暂停后一步步单步执行监视每个变量的变化&#xff0c;方便直观的判断每一步逻辑的正确性&#xff0c;即使这个变量结构再复杂也能直接监视&#xff0c;可以准确…

推荐5款压箱底的小工具软件

今天要给大家推荐5款压箱底的宝贝软件了&#xff0c;百度搜索一下就能找到下载链接了。 1.阅读笔记——BookxNote BookxNote 是一款 PDF 和 EPUB 阅读笔记软件&#xff0c;集阅读、笔记、批注、思维导图、划词翻译等于一体&#xff0c;可以边读边记。它的标注功能非常全&…

惊 GitHub首次开源,在国内外都被称为分布式理论+实践的巅峰之作

前言 蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#…

自有服务器(2台)被 kthreaddk木马挖矿解决过程(实操)不重启服务器

第一台服务器&#xff1a; #查看进程和CPU使用情况 top #查找相关联的进程 systemctl status 326858 #查看下所的 端口号和进程&#xff0c;发现有异常端口和进程 netstat -ntpl #杀死关联进程&#xff08;异常进程&#xff09;&#xff0c; kill -9 2900707 #杀死主进程&a…

Redis高可用之主从复制架构(第一部分)

引言 之前的文章 Redis持久化策略AOF、RDB详解及源码分析&#xff0c;我们介绍了Redis中的数据持久化技术&#xff0c;包括 RDB快照 和 AOF日志以及混合持久化 。有了持久化技术&#xff0c;我们就不用担心因Redis所在服务机器宕机&#xff0c;导致数据丢失。但是&#xff0c;…

四阶龙格库塔法求解一次常微分方程组(python实现)

四阶龙格库塔法求解一次常微分方程组一、前言二、RK4求解方程组的要点1. 将方程组转化为RK4求解要求的标准形式2. 注意区分每个方程的独立性三、python实现RK4求解一次常微分方程组1. 使用的方程组2. python代码3. 运行结果一、前言 之前在博客发布了关于使用四阶龙格库塔方法…

字节测试开发最牛教程,全栈Jmeter_性能测试(总结)

Jmeter_性能测试(4)&#xff1a; 性能测试脚本的优化 以PHP论坛为例&#xff1a;http://47.107.178.45/phpwind/ 根据上一篇的性能测试(3&#xff09;的脚本进行优化&#xff1b;见下图&#xff1a; 如上图中&#xff0c;把发帖和回帖的事务添加到随机控制器中&#xff0c;登…

一例cobalt Strike 反射式注入payload的分析

一例cobalt Strike payload 反射式dll注入的分析 QakBot(Qbot)与cobalt Strike恶意流量样本分析 | Demon (ggsec.cn)这篇博客中末尾提到了一个cobastrick的payload&#xff0c;这是一段shellcode&#xff0c;主要功能是的解密出一个dll&#xff0c;采用反射式注入的方式启动这…

EC 中的Keyboard Controller

Keyboard Controller简称KBC,它是EC芯片中一个用于处理Keyboard、Mouse的模块,也可以说,它只是一个通道,因为最后处理数据的还是交给EC 8032处理器去处理。KBC只处理挂在EC PS/2接口上的设备,假如接了个usb键盘或鼠标,那可不关它的事。PS/2设备只有两种,即Keyboard和Mou…

React 的设计理念(React 哲学)

文章目录React 的设计理念 的理解解决 CPU 瓶颈解决 IO 瓶颈React 的设计理念 的理解 从 React 官网中的 React 哲学文档中&#xff0c;可以看出 React 目的是实现快速响应 影响快速响应的因素&#xff1a;计算能力和网络延迟&#xff0c;即 CPU 和 IO 的瓶颈 解决 CPU 瓶颈 …

再见 ETH India 2022 建设者们 让我们一起回顾这个美好的建设周

很难超越的1700名黑客马拉松比赛&#xff0c;但是以太坊社区出现并打破了ETH India 2022 的新记录。来自321个城市的2000名与会者在短短的一个周内构建并部署了多达459个项目到以太坊生态系统中。你可能错过了过去一周发生的一切&#xff0c;但幸运的是&#xff0c;我们收集了所…

智能设备带来全新体验,打造未来智能生活

随着科技的快速发展&#xff0c;我们的生活变得越来越智能化&#xff0c;近年来智能设备已经遍布我们生活的各个领域&#xff0c;推动了生产能力和质量&#xff0c;给人们的生活带来了极大的便利。智能设备的出现和发展是时代进步的必然产物&#xff0c;高效、安全、准确性高&a…

【蓝桥杯选拔赛真题50】Scratch小猫跑步 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch小猫跑步 一、题目要求 编程实现 二、案例分析 1、角色分析

mybatis写postgis原生sql需要加强转类型 以及 配置geometry类型转换

mybatis类型转换器处理PostGis数据库geometry类型转换_SomeOtherTime的博客-CSDN博客_java mybatis postgis 在navicate写insert into "district" (name,code,position) VALUES(cesh2i3,ac1v3,SRID4326;MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0))) 不会报错。 在mybat…

[附源码]计算机毕业设计高校学生信息采集系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

虹科案例 | 光热测厚技术助力PSA无底漆涂装方案

法国标致雪铁龙集团&#xff08;PSA Peugeot Citron&#xff09;最开始是生产胡椒研磨机&#xff0c;然后将其产品组合扩展到自行车等&#xff0c;现在已经是欧洲第二大汽车制造商。巴黎郊外的普瓦西&#xff08;Poissy&#xff09; 工厂安装了法国首个紧凑型水性喷漆工艺&…

漏洞预警| ThinkPHP多版本存在远程代码执行漏洞

棱镜七彩安全预警 近日网上有关于开源项目 ThinkPHP 存在远程代码执行漏洞&#xff0c;棱镜七彩威胁情报团队第一时间探测到&#xff0c;经分析研判&#xff0c;向全社会发起开源漏洞预警公告&#xff0c;提醒相关安全团队及时响应。 项目介绍 ThinkPHP是一个快速、兼容而且…

制定项目管理计划的10个步骤

一个协调完美、透明、时间表具体且准确的项目管理计划&#xff0c;将大大有助于你的项目按时完成。以下是制定项目计划的10个基本步骤。 第1步&#xff1a;与利益相关者讨论计划和关键部分 项目计划由活动文件组成&#xff0c;这些文件为所有直接或间接参与项目的人提供指导。…

如何开通股票接口中的StockQuoteRecord功能?

股票接口中的StockQuoteRecord&#xff0c;也就是十档行情快照&#xff0c;在传统的行情软件中只能看到委托数量&#xff0c;而无法知道这些数据是如何形成的。 下面看一下股票接口StockQuoteRecord&#xff08;十档行情快照&#xff09;的说明&#xff1a; 字段名 类型 备…