气球飘飘:用Java Swing创造令人心旷神怡的视觉奇观

news2024/11/23 19:18:39

博主:命运之光

专栏:Java经典程序设计

 前言:这篇博客在手机上打开可能会自动播放视频,视频有音乐,请及时关闭手机音乐哈🙂

目录

✨导语

✨引言

✨简单介绍一下Javaswing这项技术简单介绍一下Javaswing这项技术(选读,感兴趣的可以了解一下哈(●'◡'●))

✨程序展示(1)

✨程序展示(2) 

✨视频展示(1)

✨视频展示(2)

🍓源代码(气球飘飘)

🍓源代码(气球飘飘2)

✨结语


✨导语

欢迎来到我的博客!你是否曾经想象过能够创造出一个令人心旷神怡的视觉奇观?在本文中,我将向你展示如何利用Java Swing技术,以及一些简单的代码,让彩色气球在屏幕上飘舞起来。这种视觉效果不仅适合儿童节,也可以为你的应用程序增添一份活力和趣味。让我们一起进入这个有趣的编程世界,为我们的程序注入一些令人愉悦的色彩吧!快来探索如何编写这个令人惊叹的气球飘飘效果,给你的应用程序带来惊喜和乐趣吧!


✨引言

儿童节快乐!在这个特殊的日子里,我想向所有的孩子们致以最诚挚的祝福。作为一位热爱编程和创造的开发者,我决定写下这篇博客,与大家分享一个简单而有趣的项目,让我们一起用Java Swing创造一个令人愉悦的气球飘飘效果。


简单介绍一下Javaswing这项技术简单介绍一下Javaswing这项技术(选读,感兴趣的可以了解一下哈(●'◡'●))

Javaswing是一种基于Java的图形用户界面(GUI)技术,它可以让开发者创建出丰富多彩的桌面应用程序。Javaswing提供了一系列的组件,如按钮、文本框、菜单、表格、树形结构等,以及一些高级功能,如拖放、撤销/重做、打印等。Javaswing的优点是跨平台、可定制、可扩展和易于使用。Javaswing的缺点是性能较低、内存占用较高、学习曲线较陡和与本地系统的集成度较低。本文将简单介绍一下Javaswing的历史、架构和应用范例,希望能给有兴趣的读者提供一些参考。

Javaswing的历史可以追溯到1995年,当时Java刚刚诞生,它的图形用户界面技术是基于AWT(Abstract Window Toolkit)的。AWT是一种与本地系统紧密耦合的技术,它使用了本地系统的组件和事件模型,因此具有很好的性能和集成度,但也导致了跨平台性和可定制性的问题。为了解决这些问题,Sun公司在1997年推出了JFC(Java Foundation Classes),其中包含了一个新的图形用户界面技术——Swing。Swing是一种纯Java的技术,它不依赖于本地系统的组件,而是自己绘制所有的界面元素,因此具有很好的跨平台性和可定制性,但也牺牲了一些性能和集成度。Swing最初是作为一个可选的扩展包提供的,后来在1998年被集成到了Java 2平台中,并成为了Java标准图形用户界面技术。

Javaswing的架构主要包括以下几个方面:组件、模型、事件、布局和外观。组件是指Swing提供的各种图形用户界面元素,如按钮、文本框等,它们都继承自javax.swing.JComponent类,这个类又继承自java.awt.Component类,因此Swing组件也可以使用AWT的一些特性,如容器、图形和字体等。模型是指Swing组件所依赖的数据结构,如按钮的状态、文本框的内容等,它们都实现了javax.swing.plaf.ComponentUI接口,这个接口定义了组件的基本行为和外观。事件是指Swing组件所响应的用户操作或系统通知,如鼠标点击、键盘输入等,它们都继承自java.awt.AWTEvent类,并使用了观察者模式来实现事件监听和分发。布局是指Swing组件在容器中的排列方式,如水平对齐、垂直对齐等,它们都实现了java.awt.LayoutManager接口,并提供了一些常用的布局管理器,如流式布局、网格布局等。外观是指Swing组件的视觉效果,如颜色、字体、图标等,它们都实现了javax.swing.plaf.ComponentUI接口,并提供了一些常用的外观风格,如金属风格、Windows风格等。

Javaswing的应用范例有很多,这里只举几个简单的例子。第一个例子是一个简单的计算器程序,它使用了Swing的按钮、文本框、标签和网格布局等组件,以及事件监听和处理等机制,实现了基本的加减乘除功能。第二个例子是一个简单的文本编辑器程序,它使用了Swing的文本区域、菜单、工具栏和滚动条等组件,以及拖放、撤销/重做和打印等功能,实现了基本的文本编辑功能。第三个例子是一个简单的图片浏览器程序,它使用了Swing的列表、标签和滑块等组件,以及图形和文件操作等技术,实现了基本的图片浏览功能。

以上就是对Javaswing这项技术的简单介绍,希望能对读者有所帮助。如果读者想要深入学习Javaswing,可以参考以下几本书籍:《Java Swing》(O'Reilly出版社),《Core Java Volume II - Advanced Features》(Prentice Hall出版社),《Java GUI程序设计》(清华大学出版社)。


✨程序展示(1)

✨程序展示(2) 


✨视频展示(1)

六一儿童节快乐(气球飘飘)

✨视频展示(2)

六一儿童节快乐(气球飘飘2)


🍓源代码(气球飘飘)

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.GeneralPath;
import java.util.ArrayList;
import javax.swing.*;

public class BalloonAnimation extends JFrame {
    private static final int FRAME_WIDTH = 800;
    private static final int FRAME_HEIGHT = 600;
    private static final int BALLOON_COUNT = 5;
    private static final int BALLOON_SPACING = 50;
    private static final int MAX_DELAY = 1000; // 最大延迟时间(毫秒)
    private static final int MIN_SPEED = 1; // 最小速度
    private static final int MAX_SPEED = 2; // 最大速度

    private List<Point> balloons;
    private List<Color> balloonColors;
    private List<Integer> balloonDelays;
    private List<Integer> balloonSpeeds;

    public BalloonAnimation() {
        setTitle("气球飘飘");
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);

        balloons = new ArrayList<>();
        balloonColors = new ArrayList<>();
        balloonDelays = new ArrayList<>();
        balloonSpeeds = new ArrayList<>();
        generateBalloons();

        BalloonPanel balloonPanel = new BalloonPanel();
        add(balloonPanel);

        setVisible(true);

        startAnimation();
    }

    private void generateBalloons() {
        int totalWidth = BALLOON_COUNT * (BalloonPanel.BALLOON_WIDTH + BALLOON_SPACING) - BALLOON_SPACING;
        int startX = (FRAME_WIDTH - totalWidth) / 2;

        Random random = new Random();

        for (int i = 0; i < BALLOON_COUNT; i++) {
            int x = startX + i * (BalloonPanel.BALLOON_WIDTH + BALLOON_SPACING);
            int y = FRAME_HEIGHT;
            balloons.add(new Point(x, y));

            // 生成随机颜色
            int red = random.nextInt(256);
            int green = random.nextInt(256);
            int blue = random.nextInt(256);
            Color color = new Color(red, green, blue);
            balloonColors.add(color);

            // 生成随机延迟时间
            int delay = random.nextInt(MAX_DELAY);
            balloonDelays.add(delay);

            // 生成随机速度
            int speed = random.nextInt(MAX_SPEED - MIN_SPEED + 1) + MIN_SPEED;
            balloonSpeeds.add(speed);
        }
    }

    private void startAnimation() {
        for (int i = 0; i < BALLOON_COUNT; i++) {
            int index = i;
            Timer timer = new Timer(balloonDelays.get(i), e -> {
                Point balloon = balloons.get(index);
                balloon.y -= balloonSpeeds.get(index); // 根据速度移动气球位置
                repaint();

                if (balloon.y <= -BalloonPanel.BALLOON_HEIGHT) {
                    // 当气球到达顶部后,重新设置气球位置到底部
                    balloon.y = FRAME_HEIGHT;
                }

                Timer nextTimer = new Timer(20, evt -> {
                    Point nextBalloon = balloons.get(index);
                    nextBalloon.y -= balloonSpeeds.get(index); // 根据速度移动气球位置
                    repaint();

                    if (nextBalloon.y <= -BalloonPanel.BALLOON_HEIGHT) {
                        // 当气球到达顶部后,重新设置气球位置到底部
                        nextBalloon.y = FRAME_HEIGHT;
                    }
                });
                nextTimer.setRepeats(true);
                nextTimer.start();
            });
            timer.setRepeats(false);
            timer.start();
        }
    }

    private class BalloonPanel extends JPanel {
        private static final int BALLOON_WIDTH = 100;
        private static final int BALLOON_HEIGHT = 150;
        private static final int LINE_LENGTH = 90; // 线段的长度

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            for (int i = 0; i < balloons.size(); i++) {
                Point balloon = balloons.get(i);
                int x = balloon.x;
                int y = balloon.y;
                Color color = balloonColors.get(i);

                // 绘制气球
                g.setColor(color);
                g.fillOval(x, y, BALLOON_WIDTH, BALLOON_HEIGHT);

                // 绘制垂直线段
                int lineX = x + BALLOON_WIDTH / 2;
                int startY = y + BALLOON_HEIGHT;
                int endY = startY + LINE_LENGTH;
                g.setColor(Color.BLACK);
                g.drawLine(lineX, startY, lineX, endY);

                // 绘制文字
                Font font = new Font("宋体", Font.BOLD, 18);
                g.setFont(font);
                g.setColor(Color.black);
                String text = "六一儿童节快乐!";
                int textWidth = g.getFontMetrics(font).stringWidth(text);
                int textX = x + (BALLOON_WIDTH - textWidth) / 2;
                int textY = endY + 20; // 文字位于线段结束点的下方一定距离
                g.drawString(text, textX, textY);
            }
        }
    }





    public static void main(String[] args) {
        SwingUtilities.invokeLater(BalloonAnimation::new);
    }
}

🍓源代码(气球飘飘2)

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class BalloonAnimation extends JFrame {
    private static final int FRAME_WIDTH = 800;
    private static final int FRAME_HEIGHT = 600;
    private static final int BALLOON_COUNT = 5;
    private static final int BALLOON_SPACING = 50;
    private static final int MAX_DELAY = 5000; // 最大延迟时间(毫秒)

    private List<Point> balloons;
    private List<Color> balloonColors;
    private List<Integer> balloonDelays;

    public BalloonAnimation() {
        setTitle("气球飘飘");
        setSize(FRAME_WIDTH, FRAME_HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);

        balloons = new ArrayList<>();
        balloonColors = new ArrayList<>();
        balloonDelays = new ArrayList<>();
        generateBalloons();

        BalloonPanel balloonPanel = new BalloonPanel();
        add(balloonPanel);

        setVisible(true);

        startAnimation();
    }

    private void generateBalloons() {
        int totalWidth = BALLOON_COUNT * (BalloonPanel.BALLOON_WIDTH + BALLOON_SPACING) - BALLOON_SPACING;
        int startX = (FRAME_WIDTH - totalWidth) / 2;

        Random random = new Random();

        for (int i = 0; i < BALLOON_COUNT; i++) {
            int x = startX + i * (BalloonPanel.BALLOON_WIDTH + BALLOON_SPACING);
            int y = FRAME_HEIGHT;
            balloons.add(new Point(x, y));

            // 生成随机颜色
            int red = random.nextInt(256);
            int green = random.nextInt(256);
            int blue = random.nextInt(256);
            Color color = new Color(red, green, blue);
            balloonColors.add(color);

            // 生成随机延迟时间
            int delay = random.nextInt(MAX_DELAY);
            balloonDelays.add(delay);
        }
    }

    private void startAnimation() {
        for (int i = 0; i < BALLOON_COUNT; i++) {
            int index = i;
            Timer timer = new Timer(balloonDelays.get(i), e -> {
                Point balloon = balloons.get(index);
                balloon.y -= 1;
                repaint();

                if (balloon.y > 0) {
                    Timer nextTimer = new Timer(20, evt -> {
                        Point nextBalloon = balloons.get(index);
                        nextBalloon.y -= 1;
                        repaint();
                    });
                    nextTimer.setRepeats(true);
                    nextTimer.start();
                }
            });
            timer.setRepeats(false);
            timer.start();
        }
    }

    private class BalloonPanel extends JPanel {
        private static final int BALLOON_WIDTH = 100;
        private static final int BALLOON_HEIGHT = 150;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            for (int i = 0; i < balloons.size(); i++) {
                Point balloon = balloons.get(i);
                int x = balloon.x;
                int y = balloon.y;
                Color color = balloonColors.get(i);

                g.setColor(color);
                g.fillOval(x, y, BALLOON_WIDTH, BALLOON_HEIGHT);

                Font font = new Font("宋体", Font.BOLD, 15);
                g.setFont(font);
                g.setColor(Color.black);
                String text = "六一儿童节快乐!";
                int textWidth = g.getFontMetrics(font).stringWidth(text);
                int textX = x + (BALLOON_WIDTH - textWidth) / 2;
                int textY = y + BALLOON_HEIGHT / 2;
                g.drawString(text, textX, textY);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(BalloonAnimation::new);
    }
}

✨结语

🍓🍓儿童节快乐!通过这篇博客,我们一起探索了使用Java Swing创建气球飘飘效果的乐趣和创造力。我们看到了编程的魔力,如何用几行简单的代码就能营造出令人心旷神怡的视觉奇观🎉🎉🎉🎉

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

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

相关文章

简单的UDP网络程序·续写

该文承接文章 简单的UDP网络程序 对于客户端和服务端的基本源码参考上文&#xff0c;该文对服务器润色一下&#xff0c;并且实现几个基本的业务服务逻辑 目录 demo1 第一个功能&#xff1a;字典翻译 初始化字典 测试代码&#xff1a;打印 字符串分割 客户端修改 成品效果…

idea如何一个项目启动两个tomcat服务(不同端口)

目录 第一步&#xff1a;创建一个普通的springboot项目 第二步&#xff1a;编写一个controller代码&#xff0c;用来接收请求 第三步&#xff1a;复制服务&#xff0c;端口设置为8081 第四步&#xff1a;依次访问8080、8081两个服务进行测试 第一步&#xff1a;创建一个普通…

基于JavaWeb的保护动物管理系统设计与实现

摘要&#xff1a;随着全球一些稀有物种、野生动物日益稀少&#xff0c;保护动物已经成为全球多个国家开始重视并投入大量物力着手解决的重要课题。动物是大自然的产物&#xff0c;自然界是由许多复杂的生态系统构成的。有一种植物消失了&#xff0c;以这种植物为食的昆虫就会消…

easyExcel导入失败提示用户第几行有误并回滚数据

思路&#xff1a; 在controller定义一个map&#xff0c;将map传入excel监听器&#xff0c;在监听器中处理excel的数据&#xff0c;读取到某一行出现错误就将错误提示信息存入map并抛出一个异常给service。在service方法上开启事务&#xff0c;并将异常出实现数据回滚&#xff0…

vite使用vue3 v-for渲染图片时的写法

写法一 <template><divclass"demo-img"v-for"item in demoOption":key"item.code":style"background-image: url(${getImageUrl(../assets/imge/${item.img}.jpeg)})"></div> </template><script lang&qu…

2023网安最流行的10大工具(附安装包)

从事网络安全工作&#xff0c;手上自然离不开一些重要的网络安全工具。今天&#xff0c;分享10大网络安全工具。 一、Kali Linux Kali 是一个基于 Debian 的 Linux 发行版。它的目标就是为了简单&#xff1a;在一个实用的工具包里尽可能多的包含渗透和审计工具。Kali 实现了这…

Linux 之Python 定制篇-APT 软件管理和远程登录

Linux 之Python 定制篇-APT 软件管理和远程登录 apt 介绍 apt 是Advanced Packaging Tool 的简称&#xff0c;是一款安装包管理工具。在Ubuntu 下&#xff0c;我们可以使用apt 命令进行软件包的安装、删除、清理等&#xff0c;类似于Windows 中的软件管理工具。 unbuntu 软件…

【C++】深拷贝浅拷贝

前言&#xff1a;在 C 中&#xff0c;当一个对象通过赋值或拷贝即将成为另一个对象的副本时&#xff0c;会发生“浅拷贝”或“深拷贝”。 什么是浅拷贝&#xff1f; 浅拷贝是指两个对象共享同一个内存地址&#xff0c;即将源对象的数据成员的地址赋给了目标对象&#xff0c;当…

vue diff算法与虚拟dom知识整理(15) 终结篇,收尾新前到旧前全部不匹配情况

我们现在就只需要处理最后一种情况了 我们在 updateChildren.js 在while中 的if最后加个 else 当他们都没哟匹配到的情况 我们现在在updateChildren.js最上面 定义一个空对象 叫 keyMap 参考代码如下 let keyMap null;然后 在我们刚写的else中编写代码如下 //判断 如果…

Stable-Diffusion|入门怎么下载与使用civitai网站的模型(二)

C站&#xff1a;https://civitai.com/ 文章目录 1 样图2 实现2.1 下载主模型并放到正确文件夹中2.2 找到prompt2.3 生成2.4 Lora使用 3 一些有趣的项目3.1 胶片风格Lora3.2 [最近很火] 现实感很强的Majicmix-realistic 先贴几张笔者自己实验的图&#xff0c;模型来自&#xff1…

Libevent学习

一、Libevent概述 1、简介 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库&#xff0c;主要有以下几个亮点&#xff1a;事件驱动&#xff08; event-driven&#xff09;&#xff0c;高性能;轻量级&#xff0c;专注于网络&#xff0c;不如 ACE 那么臃肿庞大&…

C++必背基础知识点总结

重点&#xff1a;不借助任何外部资料就能掌握&#xff0c;考试面试大概率涉及。 掌握&#xff1a;不借助任何外部资料就能掌握&#xff0c;考试面试有可能涉及。 熟悉&#xff1a;可以适当参考资料掌握&#xff0c;考试面试有可能涉及。 了解&#xff1a;可是参考资料掌握&…

iptables的四表五链

文章目录 1. Iptables的链2.Iptables的表3.数据包过滤的匹配流程3.1 规则表之间的顺序3.2 规则链之间的顺序3.3 规则链内部各条防火墙规则之间的顺序3.4如何应用 每个 规则表&#xff0c;其实就相当于一个内核空间的容器&#xff0c; 按照规则集的不同用途进行划分为默认的四…

w11+wsl+3060安装cuda等深度学习环境

把一切都重新又梳理学习了一遍&#xff0c;然后发现很多事情其实没必要弄 0. 显卡驱动、nvidia-smi、cuda、nvcc、cuDNN、pytorch、cudatoolkit与它们之间的关系 笔者本人鸟枪换炮了&#xff0c;还是wsl环境香&#xff0c;但是按照官方教程跑完后&#xff0c;遇到了bugRuntim…

RTMPose关键点检测实战——笔记3

文章目录 摘要安装MMPose安装虚拟环境安装pytorch安装MMCV安装其他的安装包下载 MMPose下载预训练模型权重文件和视频素材 安装MMDetection安装Pytorch安装MMCV安装其它工具包下载 MMDetection安装MMDetection下载预训练模型权重文件和视频素材 MMPose预训练模型预测命令行的方…

关于render: h => h(App)的解释

当我们第一次安装完脚手架&#xff0c;打开 的时候&#xff0c;我相信&#xff0c;一定有小伙伴和我一样&#xff0c;看到main.js里面的render: h > h(App),感觉懵懵的。 因为&#xff0c;在刚开始接触vue的时候&#xff0c;我们这里是这样写的&#xff1a; 而使用了脚手…

iOS性能优化-异步绘制与异步底层View处理

前言&#xff1a; 基于UIKit的性能优化似乎已经到了瓶颈&#xff0c;无论是使用frame代理snpakit&#xff0c;缓存高度&#xff0c;减少布局层次&#xff0c;diff刷新&#xff0c;压缩图片&#xff0c;选择合适队列&#xff0c;选择高性能锁&#xff0c;也不能满足当前庞大而又…

SpringBoot 整合 MongoDB 实现数据的增删改查功能

1、介绍说明 在 MongoDB 中有三个比较重要的名词&#xff1a;数据库、集合、文档 数据库&#xff08;Database&#xff09;&#xff1a;和关系型数据库一样&#xff0c;每个数据库中有自己的用户权限&#xff0c;不同的项目组可以使用不同的数据库 集合&#xff08;Collectio…

汽车新能源 - 单体电压值为什么通常是5V以内

常见蓄电池单体电压的值&#xff08;25℃&#xff09;&#xff0c;如下表&#xff1a; 蓄电池类型单体电压&#xff08;V&#xff09;铅酸 蓄电池2.08镍金属氢 蓄电池&#xff08;NIMH&#xff09;1.32锂离子 蓄电池2.5~4.2&#xff08;典型3.6&#xff09; 单体电压为什么不…

安卓学习笔记(一)

从今天开始我们开始学习安卓的知识&#xff1a; 1.0 Android基础入门教程 1.Android背景与当前的状况 Android系统是由Andy Rubin创建的&#xff0c;后来被Google收购了&#xff1b;最早的版本是:Android 1.1版本 而现在最新的版本是今年5.28&#xff0c;Google I/O大会上推…