Java圣诞树

news2024/12/28 0:50:04

目录

写在前面

技术需求

程序设计

代码分析

一、代码结构与主要功能概述

二、代码功能分解与分析

1. 类与常量定义

2. 绘制树的主逻辑

3. 彩色球的绘制

4. 动态效果的实现

5. 窗口初始化

三、关键特性与优点

四、总结

写在后面


写在前面

Java语言绘制精美圣诞树的完整代码。 

技术需求

  1. Java Swing:使用 JFrameJPanel 来创建图形界面和绘图面板。JFrame 用于创建窗口,JPanel 用于承载绘图内容。

  2. 图形绘制(Java AWT):使用 Graphics 类进行图形绘制,主要利用 fillPolygon 绘制圣诞树、五角星和 fillOval 绘制彩色球,drawString 绘制心形符号。

  3. 随机数生成(Random 类):通过 Random 类生成随机数,主要用于生成随机颜色和心形符号的随机位置,使得每次绘制的效果都不相同。

  4. 定时器(Timer 类):使用 Timer 定时器实现每隔 500 毫秒自动重新绘制界面,产生动态更新效果。

  5. 面向对象编程(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.swingjava.awt 库绘制一个带有装饰物的圣诞树,并通过定时器实现动态更新效果。


一、代码结构与主要功能概述

这段代码以面向对象的方式编写,核心功能是通过 JPanelpaintComponent 方法在窗口中绘制一个圣诞树的图案,并动态显示心形符号和彩色球。以下是主要功能模块:

  1. 圣诞树绘制:利用三角形模拟圣诞树结构,逐层叠加。
  2. 动态心形符号绘制:心形符号随机出现在屏幕上的不同位置。
  3. 彩色装饰球绘制:在树的不同位置绘制彩色装饰球。
  4. 树顶五角星绘制:以几何方式计算并绘制一个五角星。
  5. 动态刷新:通过 Timer 类实现每隔 500 毫秒重新绘制树,带来动态效果。

二、代码功能分解与分析

1. 类与常量定义

private static final int X = 666;
private static final int Y = 400;
private Random rand = new Random();
  • XY 分别定义了窗口的宽度和高度。
  • rand 是一个 Random 对象,用于生成随机数,支持动态颜色和随机位置的绘制。

2. 绘制树的主逻辑

paintComponent(Graphics g) 方法

这是绘图的核心方法,重载了 JPanelpaintComponent 方法:

  • 调用父类方法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);
    }
    
    • baseXbaseY 是基点,用于确定三角形的中心位置。
    • 利用循环逐层叠加三角形,每层的宽度和高度递增,形成树状效果。
  • 树顶五角星绘制

    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 面板添加到窗口,显示绘制内容。

三、关键特性与优点

  1. 模块化与可维护性:绘图逻辑分为多个小模块(树形绘制、彩色球、五角星等),代码结构清晰,易于扩展。

  2. 动态更新效果:利用 Timer 实现每 500 毫秒重新绘制,使树的装饰物呈现动态效果,增加节日氛围。

  3. 随机性与个性化:每次绘制的心形符号和彩色球都具有随机性,使绘图结果多样化。

  4. 高效绘图:使用简单的图形 API(如 fillPolygonfillOval)完成复杂效果。


四、总结

这段代码展示了通过 Java Swing 绘制图形并动态更新内容的能力。其设计充分利用了基本图形绘制函数,结合随机数生成和定时器,营造出一个富有节日氛围的圣诞树动画。通过进一步优化,可以进一步提升视觉效果和代码的扩展性。

写在后面

我是一只有趣的兔子,感谢你的喜欢。

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

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

相关文章

java web项目软件自动生成使用初体验-帅帅软件生成平台ASoft

软件默认 登陆账号 admin 密码 123456 一、软件使用简介说 AI软件自动生成越来越成熟&#xff0c;但AI生成的软件代码只是片段化的&#xff0c;不成体系。有没有一款可以10-30分钟自动生成JAVA WEB休系的软件&#xff1f;我也找了好久&#xff0c;终于找到了&#xff0c;开发…

闲谭Scala(2)--安装与环境配置

1. 概述 Java开发环境安装&#xff0c;需要两步&#xff0c;第一安装JDK&#xff0c;第二配置环境变量。 Scala的话&#xff0c;也是两步&#xff0c;第一安装Scale环境&#xff0c;第二配置环境变量。 需要注意的是&#xff0c;配置环境变量&#xff0c;主要是想让windows操…

NodeRed使用心得,实现增删改查等

使用场景介绍 在VUE中使用nodeRed实现对节点的 增删改查等功能&#xff0c;且储存成功之后下点击时启动对应流程 安装与配置 1.安装NodeRed npm install -g --unsafe-perm node-red 安装完成后&#xff0c;你可以通过运行以下命令来启动Node-RED node-red-start2. 配置文件 N…

升级鸿蒙Next,小记

写在前面 这个小记是想记录一下Next系统不断完善的过程&#xff0c;给想升级还没升级的同志们一些提醒。虽然这个系统还有这样那样的一些问题&#xff0c;但是我觉得升级之后很完美 续航时间明显变长了&#xff0c;充电&#xff0c;玩游戏以前会发热&#xff0c;现在完全不会…

Android Studio | 连接手机设备后,启动App时出现:Waiting For DebuggerApplication (App名)...

在这种情况下&#xff0c;打开目录文件&#xff0c;出现 Is:/storage/emulated/: Permission denied 问题分析&#xff1a; 以上两种情况表明应用程序试图访问Android设备的存储空间中的/storage/emulated/目录&#xff0c;但是没有足够的权限去执行这个操作。 解决办法&…

如何卸载和升级 Angular-CLI ?

Angular-CLI 是开发人员使用 Angular 的必备工具。然而&#xff0c;随着频繁的更新和新版本的出现&#xff0c;了解如何有效地卸载和升级 Angular-CLI 对开发人员来说至关重要。本指南提供了一个全面的、循序渐进的方法来帮助您顺利过渡到最新版本。 必备条件 确保您的系统上…

jangow靶机

打开靶机&#xff0c;打开kali&#xff0c;有的人会发现扫不到靶机的ip 在网上搜索了半天&#xff0c;发现是靶机的网卡配置有问题 重启靶机&#xff0c;选第二个 进去后再选第二个&#xff0c;按e 找到ro这一行 把ro后面这一行的内容都替换成ro rw signin init/bin/bash ctr…

[c++进阶(三)]单例模式及特殊类的设计

1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢&#xff1f;本篇将会详细的介绍 本章重点&#xff1a; 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…

CSharp: Oracle Stored Procedure query table

存储过程查询postgreSQL,Oracle 和sql server,Mysql 有区别。程序调用也是有区别。 oracle sql script: CREATE OR REPLACE PROCEDURE procSelectSchool(paramSchoolId IN char,p_cursor OUT SYS_REFCURSOR ) AS BEGINOPEN p_cursor FORSELECT *FROM SchoolWHERE SchoolId p…

macos 隐藏、加密磁盘、文件

磁盘加密 打开磁盘工具 点击添加 设置加密参数 设置密码 查看文件 不用的时候右键卸载即可使用的时候装载磁盘&#xff0c;并输入密码即可 修改密码 解密 加密&#xff0c;输入密码即可 禁止开机自动挂载此加密磁盘 如果不禁止自动挂载磁盘&#xff0c;开机后会弹出输入…

cesium入门学习一

1.学习目的 作为网页显示&#xff0c;我只要实现了cesium网页显示&#xff0c;就可以到时候通过qt的webview显示html界面&#xff0c;来显示地图&#xff0c;js对于学过c的人而言&#xff0c;没啥难度&#xff0c;不过是换一种语法&#xff0c;而且cesium的教程相对于osgeart…

dify的ChatFlow自定义上传图片并通过HTTP请求到SpringBoot后端

前情提要 交互场景&#xff1a;dify的ChatFlow上传文件(本示例是单张图片)&#xff0c;通过HTTP请求至SpringBoot后端dify版本&#xff1a;0.13.2python版本&#xff1a;3.12.7 1. 自定义上传变量 在【开始】节点自定义变量单文件上传变量file 2. 下接HTTP请求节点 BODY要…

Flutter DragTarget拖拽控件详解

文章目录 1. DragTarget 控件的构造函数主要参数&#xff1a; 2. DragTarget 的工作原理3. 常见用法示例 1&#xff1a;实现一个简单的拖拽目标解释&#xff1a;示例 2&#xff1a;与 Draggable 结合使用解释&#xff1a; 4. DragTarget 的回调详解5. 总结 DragTarget 是 Flutt…

深度学习blog-Transformer-注意力机制和编码器解码器

注意力机制&#xff1a;当我们看一个图像或者听一段音频时&#xff0c;会根据自己的需求&#xff0c;集中注意力在关键元素上&#xff0c;以获取相关信息。 同样地&#xff0c;注意力机制中的模型也会根据输入的不同部分&#xff0c;给它们不同的权重&#xff0c;并集中注意力在…

改进爬山算法之一:随机化爬山法(Stochastic Hill Climbing,SHC)

随机化爬山法(Stochastic Hill Climbing),也被称为随机爬山法,是一种基于搜索算法的优化方法,是爬山算法的一个变种,它通过引入随机性来减少算法陷入局部最优解的风险,并增加搜索解空间的能力。这种方法特别适合于解决那些具有多个局部最优解的优化问题。 一、算法思想 …

AntDB 分布式集群模式部署

1 说明 如下图所示&#xff0c;AntDB 分布式数据库&#xff0c;包含计算节点&#xff08;CN&#xff09;、数据节点&#xff08;DN&#xff09;、全局事务管理 节点&#xff08;GTM&#xff09;和集群管理节点&#xff08;MGR&#xff09;&#xff0c;共 4 个组成部分。 在…

Mysql数据库Redo日志和Undo日志的理解

数据库redo日志和undo日志 1、redo日志1.1 redo日志的作用1.1.1 不使用redo日志的问题1.1.2 使用redo日志的好处 1.2 redo日志刷盘策略 2、undo日志2.1 undo日志的作用2.2 undo日志的简要生成过程 1、redo日志 事务的4大特性&#xff08;ACID&#xff09;&#xff1a;原子性、…

Git(11)之log显示支持中文

Git(11)之log显示支持中文 Author&#xff1a;Once Day Date&#xff1a;2024年12月21日 漫漫长路有人对你微笑过嘛… 参考文档&#xff1a;GIT使用log命令显示中文乱码_gitlab的log在matlab里显示中文乱码-CSDN博客 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSD…

循环神经网络(RNN)入门指南:从原理到实践

目录 1. 循环神经网络的基本概念 2. 简单循环网络及其应用 3. 参数学习与优化 4. 基于门控的循环神经网络 4.1 长短期记忆网络&#xff08;LSTM&#xff09; 4.1.1 LSTM的核心组件&#xff1a; 4.2 门控循环单元&#xff08;GRU&#xff09; 5 实际应用中的优化技巧 5…

腾讯云云开发 Copilot 深度探索与实战分享

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、引言 二、产品介绍 三、产品体验过程 四、整体总结 五、给开发者的复用建议 六、对 AI 辅助开发的前景展望 一、引言 在当今数字化转型加速的时代&#xff0c;…