Java圣诞树
目录
写在前面
技术需求
程序设计
代码分析
一、代码结构与主要功能概述
二、代码功能分解与分析
1. 类与常量定义
2. 绘制树的主逻辑
3. 彩色球的绘制
4. 动态效果的实现
5. 窗口初始化
三、关键特性与优点
四、总结
写在后面
写在前面
Java语言绘制精美圣诞树的完整代码。
技术需求
-
Java Swing:使用
JFrame
和JPanel
来创建图形界面和绘图面板。JFrame
用于创建窗口,JPanel
用于承载绘图内容。 -
图形绘制(Java AWT):使用
Graphics
类进行图形绘制,主要利用fillPolygon
绘制圣诞树、五角星和fillOval
绘制彩色球,drawString
绘制心形符号。 -
随机数生成(
Random
类):通过Random
类生成随机数,主要用于生成随机颜色和心形符号的随机位置,使得每次绘制的效果都不相同。 -
定时器(
Timer
类):使用Timer
定时器实现每隔 500 毫秒自动重新绘制界面,产生动态更新效果。 -
面向对象编程(OOP):利用面向对象的设计方式,将圣诞树绘制功能封装在
ChristmasTree
类中,增强代码的模块化和可维护性。
程序设计
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.*;
import javax.swing.*;public class ChristmasTree extends JFrame {MyPanel p;public static void main(String[] args) {new ChristmasTree();}ChristmasTree() {p = new MyPanel();add(p);setTitle("圣诞树");setBounds(400, 200, 800, 600);setVisible(true);validate();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}……
代码分析
以下是对该Java代码的详细分析,其作用是通过 javax.swing
和 java.awt
库绘制一个带有装饰物的圣诞树,并通过定时器实现动态更新效果。
一、代码结构与主要功能概述
这段代码以面向对象的方式编写,核心功能是通过 JPanel
的 paintComponent
方法在窗口中绘制一个圣诞树的图案,并动态显示心形符号和彩色球。以下是主要功能模块:
- 圣诞树绘制:利用三角形模拟圣诞树结构,逐层叠加。
- 动态心形符号绘制:心形符号随机出现在屏幕上的不同位置。
- 彩色装饰球绘制:在树的不同位置绘制彩色装饰球。
- 树顶五角星绘制:以几何方式计算并绘制一个五角星。
- 动态刷新:通过
Timer
类实现每隔 500 毫秒重新绘制树,带来动态效果。
二、代码功能分解与分析
1. 类与常量定义
private static final int X = 666;
private static final int Y = 400;
private Random rand = new Random();
X
和Y
分别定义了窗口的宽度和高度。rand
是一个Random
对象,用于生成随机数,支持动态颜色和随机位置的绘制。
2. 绘制树的主逻辑
paintComponent(Graphics g)
方法
这是绘图的核心方法,重载了 JPanel
的 paintComponent
方法:
-
调用父类方法:
super.paintComponent(g)
清空上一次的绘图内容,避免出现叠加。 -
随机心形符号绘制:
for (int i = 0; i < 5; i++) {g.drawString("❤", rand.nextInt(X - 10), rand.nextInt(Y - 10)); }
利用随机数生成心形符号的坐标,达到随机位置的效果。
-
树形结构绘制:
for (int i = 0; i < 10; i++) {int[] xPoints = {baseX, baseX - (width + i * 10), baseX + (width + i * 10)};int[] yPoints = {baseY + i * height / 2, baseY + (i + 1) * height, baseY + (i + 1) * height};g.fillPolygon(xPoints, yPoints, 3); }
baseX
和baseY
是基点,用于确定三角形的中心位置。- 利用循环逐层叠加三角形,每层的宽度和高度递增,形成树状效果。
-
树顶五角星绘制:
double a = Math.PI / 2; for (int i = 0; i < 5; i++) {starX[i] = (int) (baseX + Math.cos(a) * 23);starY[i] = (int) (baseY - Math.sin(a) * 23);a += Math.PI * 4 / 5; } g.fillPolygon(starX, starY, 5);
五角星通过数学公式生成顶点:
- 通过余弦和正弦函数计算顶点的坐标。
- 角度
a
初始为PI/2
(90°),每次累加PI*4/5
,确保绘制出标准五角星。
-
树的底部绘制:
g.setColor(new Color(139, 69, 19)); g.fillRect(X * 19 / 40, baseY + 10 * height, X * 2 / 40, height * 2);
用
fillRect
方法绘制树干的矩形。
3. 彩色球的绘制
private void drawRandomBalls(Graphics g) {g.setColor(new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256)));g.fillOval(X * 12 / 25, Y * 25 / 100, 10, 10);// 省略其他球的绘制
}
- 调用
fillOval
方法在指定位置绘制彩色球。 - 每次绘制时随机生成 RGB 值以改变颜色。
- 球的直径固定为 10,分布在树的不同位置。
4. 动态效果的实现
Timer timer = new Timer(500, e -> panel.repaint());
timer.start();
Timer
类定时调用repaint()
方法,以 500 毫秒的间隔重新绘制。- 每次绘制时心形符号、彩色球和颜色都随机变化,增加动态性。
5. 窗口初始化
JFrame frame = new JFrame("Christmas Tree");
ChristmasTree panel = new ChristmasTree();
frame.setSize(X, Y);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.setVisible(true);
- 创建一个
JFrame
窗口,设置标题、大小和关闭行为。 - 将
ChristmasTree
面板添加到窗口,显示绘制内容。
三、关键特性与优点
-
模块化与可维护性:绘图逻辑分为多个小模块(树形绘制、彩色球、五角星等),代码结构清晰,易于扩展。
-
动态更新效果:利用
Timer
实现每 500 毫秒重新绘制,使树的装饰物呈现动态效果,增加节日氛围。 -
随机性与个性化:每次绘制的心形符号和彩色球都具有随机性,使绘图结果多样化。
-
高效绘图:使用简单的图形 API(如
fillPolygon
、fillOval
)完成复杂效果。
四、总结
这段代码展示了通过 Java Swing 绘制图形并动态更新内容的能力。其设计充分利用了基本图形绘制函数,结合随机数生成和定时器,营造出一个富有节日氛围的圣诞树动画。通过进一步优化,可以进一步提升视觉效果和代码的扩展性。
写在后面
我是一只有趣的兔子,感谢你的喜欢。
相关文章:
Java圣诞树
目录 写在前面 技术需求 程序设计 代码分析 一、代码结构与主要功能概述 二、代码功能分解与分析 1. 类与常量定义 2. 绘制树的主逻辑 3. 彩色球的绘制 4. 动态效果的实现 5. 窗口初始化 三、关键特性与优点 四、总结 写在后面 写在前面 Java语言绘制精美圣诞树…...
在Python如何用Type创建类
文章目录 一,如何创建类1:创建一个简单类2:添加属性和方法3:动态继承父类4:结合元类的使用总结 二.在什么情境下适合使用Type创建类1. **运行时动态生成类**2. **避免重复代码**3. **依赖元类或高级元编程**4. **动态扩…...
04软件测试需求分析案例-用户登录
通读文档,提取信息,提出问题,整理为需求。 从需求规格说明、设计说明、配置说明等文档获取原始需求,通读原始需求,分析有哪些功能,每种功能要完成什么业务,业务该如何实现,业务逻辑…...
替代传统FTP传输,镭速大数据传输系统实现安全高效数据流转!
信息技术的快速进步让大数据成为了企业决策的关键支撑,但同时也带来了巨大的挑战。企业在运营过程中产生的数据量急剧增加,这对数据传输的速度、安全性和效率提出了更高的要求。然而,传统的FTP传输方式在处理大规模数据时显得力不从心&#x…...
SpringMVC学习(一)——请求与响应处理
目录 一、SpringMVC简介 二、RequestMapping:请求路径映射 三、RestController 四、请求限定 五、请求处理 1.使用普通变量,收集请求参数 2.使用RequestParam明确指定获取参数 3.目标方法参数是一个pojo 4.RequestHeader:获取请求…...
大语言模型学习工具及资源总结和落地应用
当前,随着人工智能技术的迅猛发展,大语言模型(Large Language Models, LLMs)在各个领域的应用日益广泛。以下是国内外常见的大语言模型工具、已经落地部署的应用以及学习相关的网站和资源的详细介绍。 一、国内外常见的大语言模型…...
深度学习使用Anaconda打开Jupyter Notebook编码
新手入门深度学习使用Anaconda打开Jupyter Notebook编码 1. 安装Anaconda 第一种是Anaconda官网下载安装包,但是很慢,不太建议 第二种使用国内清华大学镜像源下载 选择适合自己电脑的版本,支持windows,linux系统 下载完之后自行…...
【视觉惯性SLAM:四、相机成像模型】
相机成像模型介绍 相机成像模型是计算机视觉和图像处理中的核心内容,它描述了真实三维世界如何通过相机映射到二维图像平面。相机成像模型通常包括针孔相机的基本成像原理、数学模型,以及在实际应用中如何处理相机的各种畸变现象。 一、针孔相机成像原…...
Firewalld 防火墙详解:深入理解与实践指南
在现代网络环境中,防火墙是保护系统和网络不受未授权访问的关键工具。firewalld是Linux系统中广泛使用的动态防火墙管理工具,它提供了强大的功能和灵活的配置选项。本文将深入探讨firewalld防火墙的工作原理、配置和管理,以及如何在实际环境中…...
在linux系统中使用jdbc访问sqlite数据库时报错“java.lang.UnsatisfiedLinkError”
1. 异常描述 在linux系统中使用jdbc访问sqlite数据库时出现如下错误提示: 2. 异常分析 可能是当前使用版本的sqlite-jdbc-xxx.jar版本有bug。 3. 异常解决 我是从3.8.9.1版本换到了3.16.1版本就好了。...
华为管理变革之道:管理制度创新
目录 华为崛起两大因素:管理制度创新和组织文化。 管理是科学,150年来管理史上最伟大的创新是流程 为什么要变革? 向世界标杆学习,是变革第一方法论 体系之一:华为的DSTE战略管理体系(解决:…...
MySQL 临时表:使用技巧与最佳实践
MySQL 临时表:使用技巧与最佳实践 引言 在数据库管理系统中,临时表是一种常见的数据结构,它允许用户存储临时数据,这些数据只在当前会话或事务中有效。MySQL 作为一种广泛使用的数据库管理系统,也提供了对临时表的支…...
华为云语音交互SIS的使用案例(文字转语音-详细教程)
文章目录 题记一 、语音交互服务(Speech Interaction Service,简称SIS)二、功能介绍1、实时语音识别2、一句话识别3、录音文件识别4、语音合成 三、约束与限制四、使用1、API2、SDK 五、项目集成1、引入pom依赖2、初始化 Client1)…...
【Rust自学】6.3. 控制流运算符-match
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 6.3.1. 什么是match match允许一个值与一系列模式进行匹配,并执行匹配的模式对应的代码。模式可以是字面值、变量名、通配符等…...
AIA - IMSIC之二(附IMSIC处理流程图)
本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…...
Excel中一次查询返回多列
使用Excel或wps的时候,有时候需要一次查询返回多列内容,这种情况可以选择多次vlookup或者多次xlookup,但是这种做法费时费力不说,效率还有些低下,特别是要查询的列数过多时。我放了3种查询方法,效果图&…...
SQLAlchemy示例(连接数据库插入表数据)
背景需求 连接数据库,插入表中一些数据。 其用户是新建用户,所以只能插入,不能更新。 再次输入数据则使用更新数据语法,这个没调试。 #! /usr/bin/env python # -*- coding: utf-8 -*-from sqlalchemy import create_engine, …...
AG32 MCU 的电机控制方案
原创 AG32 AG32MCU cpld 2024年12月24日 17:23 浙江 AG32 MCU 的电机控制方案 在工业自动化、智能家居、新能源设备等众多领域,电机控制的精准性、稳定性和高效性至关重要。 AG32 MCU 凭借其高性能处理器、丰富的外设资源以及独特的 2K CPLD 资源,在电机…...
Linux:进程概念
1.冯诺依曼体系结构 结论: --- CPU不和外设直接打交道,和内存直接打交道。 --- 所有的外设,有数据需要收入,只能载入到内存中;内存写出,也一定是写道外设中。 --- 为什么程序要运行必须加载到内存…...
使用 Webpack 优雅的构建微前端应用❕
Module Federation 通常译作“模块联邦”,是 Webpack 5 新引入的一种远程模块动态加载、运行技术。MF 允许我们将原本单个巨大应用按我们理想的方式拆分成多个体积更小、职责更内聚的小应用形式,理想情况下各个应用能够实现独立部署、独立开发(不同应用甚…...
【Leetcode 热题 100】208. 实现 Trie (前缀树)
问题背景 T r i e Trie Trie 或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象。void insert(String word…...
从0开始在linux服务器上部署SpringBoot和Vue
目录 一、申请服务器的IP (1)阿里云申请IP (2)设置服务器的密码 (3)远程终端——MobaXterm 二、Docker (1)安装Docker (2)镜像加速 (3&…...
41 stack类与queue类
目录 一、简介 (一)stack类 (二)queue类 二、使用与模拟实现 (一)stack类 1、使用 2、OJ题 (1)最小栈 (2)栈的弹出压入序列 (3…...
代码随想录-笔记-其八
让我们开始:动态规划! 70. 爬楼梯 - 力扣(LeetCode) 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? class Solution { public:int climbStairs(i…...
信号仿真高级工程师面试题
信号仿真高级工程师面试题可能涵盖多个方面,旨在全面评估应聘者的专业知识、技能水平、实践经验和问题解决能力。以下是一些可能的面试题及其简要解析: 一、专业知识与技能 描述你对信号仿真的理解 考察点:对信号仿真基本概念、原理及应用的掌握程度。参考答案:信号仿真是…...
FLTK - build fltk-1.1.10 on vs2019
文章目录 FLTK - build fltk-1.1.10 on vs2019概述笔记buildtest测试程序运行 END FLTK - build fltk-1.1.10 on vs2019 概述 看书上用到了fltk-1.1.10, 用vs2019试试能否正常编译使用? 笔记 build 从官网下载fltk-1.1.10-source.tar.bz2 用7zip解开 fltk-1.1.10-source.…...
FPGA远程升级 -- FLASH控制
简介 前文讲到如何实现XILINX芯片程序跳转,但升级程序是事先通过VIVADO工具将两个程序合成一个BIN文件实现升级的,并不能在线更新升级。要实现远程升级的能力需要对FPGA的FLASH进行在线写入升级程序。 FLASH介绍 本次设计FLASH选用的是S25FL128芯片&…...
蓝牙BLE开发——解决iOS设备获取MAC方式
解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址,在Android、iOS不同端中互通,根据MAC 地址处理相关的业务场景; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…...
【总结(三)】单片机重点知识总结记录(串口重定向+按键消抖+延时)
一.串口重定向 串口重定向代码如下 注意: 要添加头文件include "stdio.h"要勾选微库,即Use MicroLIB /**********重定向************/ //串口1 int fputc(int ch, FILE *f) {HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff)…...
攻防世界 unserialize3
开启场景 题目为unserialize3,这个单词在php中代表反序列化,代码 __wakeup 也是php反序列化中常见的魔术方法,所以这个题基本就是和反序列化有关的题目。根据代码提示,编写一个Exploit运行,将对象xctf的信息序列化 得到…...
ISDP010_基于DDD架构实现收银用例主成功场景
信息系统开发实践 | 系列文章传送门 ISDP001_课程概述 ISDP002_Maven上_创建Maven项目 ISDP003_Maven下_Maven项目依赖配置 ISDP004_创建SpringBoot3项目 ISDP005_Spring组件与自动装配 ISDP006_逻辑架构设计 ISDP007_Springboot日志配置与单元测试 ISDP008_SpringB…...
如何注册华为云国际版账户:详细步骤指南
华为云作为全球知名的云计算服务提供商,提供了丰富的云服务和解决方案。无论是企业还是个人开发者,注册华为云国际版账户都是开启云计算之旅的第一步。我们九河云通过本文将为您详细介绍华为云国际版的注册流程。 第一步:访问华为云国际版官网…...
存储过程实现多个分类不同计算规则得到对应的分类、月份和款号
该存储过程 PRO_MON_MDCODE 实现多个分类不同计算规则得到对应的分类、月份和款号,其中线下分类的款最早出现时间会在20230101,最晚是当前月份后12月,电商的款取商品维表的23,24,25年商品年份的A款,其他业务分类逻辑(A-线上,B电商公司,C品牌公司)的款最早出现时间会在2…...
【LeetCode】906、超级回文数
【LeetCode】906、超级回文数 文章目录 一、通过数据量猜解法 枚举 数学 回文1.1 通过数据量猜解法 枚举 数学 回文1.2 多语言解法 二、打表法 一、通过数据量猜解法 枚举 数学 回文 1.1 通过数据量猜解法 枚举 数学 回文 减小数据规模: 先构成回文, 再平方, 再判断是否是范围…...
使 el-input 内部的内容紧贴左边
<el-inputv-model"form.invitor"placeholder"PC端的自动取当前账号的手机号"readonlyclass"no-border-input" />::v-deep(.no-border-input .el-input__inner) { border: none; box-shadow: none; padding-left: 0; /* 确保内容紧贴左边 *…...
【ES6复习笔记】模板字符串(3)
介绍 模板字符串是 ES6 引入的一种新的字符串声明方式,它使用反引号()来定义字符串,而不是单引号()或双引号(")。模板字符串可以包含变量、表达式和换行符,这使得它…...
Linux学习
Linux Linux目录结构 Linux只有一个顶级目录,称之为:根目录 /在Linux系统中表示 出现在开头的/表示:根目录 出现在后面的/表示:层次关系 Linux命令基础 什么是命令、命令行 命令:即Linux操作指令,是系…...
【PostgreSQL使用】最新功能逻辑复制槽的failover,大数据下高可用再添利器
逻辑复制的failover 专栏内容: postgresql入门到进阶手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. ✅ ὒ…...
MongoDB 创建用户、User、Role 相关 操作
创建用户 # db.createUser() Creates a new user.详细 查看 db.createUser() - MongoDB Manual v8.0 设置用户 Role(创建用户时也可以设置) # db.grantRolesToUser() Grants a role and its privileges to a user. 详细 查看 db.grantRolesToUser(…...
在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)
一、概述 记录时间 [2024-12-26] 本文讲述如何在 Vue3 项目中使用计时器组件。具体包括开发环境的配置,ViteVue 项目的创建,Element Plus 插件的使用,以及计时器组件的创建和使用。 想要直接实现计时器组件,查看文章的第四部分。…...
Redis单线程快的原因
基于内存操作:Redis将数据存储在内存中,使得数据的读写速度极快,这是其性能优势的主要原因。单线程避免上下文切换:在多线程环境下,CPU核数有限,线程上下文切换会带来性能损耗。Redis采用单线程,…...
基于SpringBoot的“在线BLOG网”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“在线BLOG网”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 在线BLOG网结构功能图 管理员登录功能界面 用户信息…...
重温设计模式--6、享元模式
文章目录 享元模式(Flyweight Pattern)概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式(Flyweight Pattern)概述 定义: 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式࿰…...
springboot-starter版本升级es版本问题
一、背景说明 版本漏洞处理,springboot版本升级,es版本暂不升级,但是pom引用中es版本一直为7.17.15高版本,不想显示声明版本,定位具体问题,最后还是重新定义了版本进行处理。 二、异常情况 这里看4.4.18是…...
嵌入式科普(25)Home Assistant米家集成意味着IOT的核心是智能设备
目录 一、概述 二、一张图说尽HA 三、HA的相关资料 四、米家集成划重点 五、总结 一、概述 小米Home Assistant 米家集成开源一周star近15k,迭代4个版本,12个贡献者 本文科普一下Home Assistant(简称HA)、米家集成ÿ…...
前端Python应用指南(四)Django实战:创建一个简单的博客系统
《写给前端的python应用指南》系列: (一)快速构建 Web 服务器 - Flask vs Node.js 对比(二)深入Flask:理解Flask的应用结构与模块化设计(三)Django vs Flask:哪种框架适…...
webrtc获取IceCandidate流程
在WebRTC(Web Real-Time Communication)中,ICECandidate是一个关键概念,它用于描述在建立点对点(P2P)连接时可以考虑的潜在通信端点。以下是关于WebRTC中ICECandidate的详细解释: 一、ICECandidate的定义 ICECandidate对象通常包含以下关键属性: foundation:用于唯一…...
快速入门Spring AI Alibaba
文章目录 前言一、环境准备二、获取API Key三、代码示例pomapplication.ymlcontroller 前言 Spring Cloud Alibaba AI 以 Spring AI 为基础,并在此基础上,基于 Spring AI 0.8.1 版本 API 完成同义系列大模型的接入实现阿里云同义系列大模型全面适配。 在…...
【mysql】MVCC及实现原理
【mysql】MVCC及实现原理 【一】介绍【1】什么是MVCC【2】什么是当前读和快照读【3】当前读,快照读和MVCC的关系【4】MVCC 能解决什么问题,好处(1)数据库并发场景有三种,分别为:(2)M…...
C++ —— 模板类与函数
C —— 模板类与函数 模板类可以用于函数的参数和返回值,有三种形式: 普通函数,参数和返回值是模板类的实例化版本。函数模板,参数和返回值是某种的模板类。函数模板,参数和返回值是任意类型(支持普通类和…...