概述


java实现简单泡泡屏保动画及点击变实心泡泡,空格暂停动画

实现思路


采用MVC(Model-View-Controller(模型-视图-控制器))设计思路。将数据层与视图层与控制层分开。

在本例中

  • Mycircle-数据层 定义圆圈类,并实现圆圈的移动函数和碰撞检测功能。
  • AlgoFrane-视图层 绘制视图
  • AlgoVisualizer-控制层 将视图与数据连接起来
  • 附:AlgoVisHelper 绘制工具类(辅助绘图),其中 有许多具体绘制的方法,例如设置绘画线宽,画实心圆,空心圆…

效果


## 源代码


MyCircle.java

/** 圆圈类*//** 数据层*/
import java.awt.*;public class MyCircle {//圆圈的圆心坐标public int x,y;//圆圈的半径private int r;//圆圈速度public int vx,vy;//圆圈颜色public Color color;//是实心还是空心public boolean isFilled = false;public MyCircle(int x, int y, int r, int vx, int vy,Color color){this.x = x;this.y = y;this.r = r;this.vx = vx;this.vy = vy;this.color = color;}public int getR(){return r;}//圆圈移动函数public void move(int minx,int miny,int maxx,int maxy){x += vx;y += vy;checkCollision(minx,miny,maxx,maxy);}//碰撞检测(与边缘碰撞后返回)private void checkCollision(int minx,int miny,int maxx,int maxy) {if (x - r < minx)  { x = r;        vx = -vx; }if (x + r >= maxx) { x = maxx - r; vx = -vx; }if (y - r < miny)  { y = r;        vy = -vy; }if (y + r >= maxy) { y = maxy - r; vy = -vy; }}//计算某点是否在圆圈内public boolean contain(Point p){return (x - p.x)*(x - p.x)+(y-p.y)*(y-p.y) <= r*r;}
}

AlgoFrame.java

import javafx.scene.shape.Circle;import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;/** 视图类*/public class AlgoFrame extends JFrame {//画布宽和高private int canvasWidth;private int canvasHeight;//指定宽高的构造函数public AlgoFrame(String title,int canvasWidth,int canvasHeight){super(title);this.canvasWidth = canvasWidth;this.canvasHeight = canvasHeight;AlgoCanvas canvas = new AlgoCanvas();setContentPane(canvas);pack();setResizable(false);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}//带默认宽高值得构造函数public AlgoFrame(String title){this(title,1024,768);}public int getCanvasWidth(){return canvasWidth;}public int getCanvasHeight(){return  canvasHeight;}//设置自己的数据:圆圈数组private MyCircle[] circles;//开始绘制public void render(MyCircle[] circles){this.circles=circles;repaint();}private class AlgoCanvas extends JPanel{public AlgoCanvas(){//打开Jpanel支持的双缓存super(true);}@Overridepublic void paintComponent(Graphics g){super.paintComponent(g);Graphics2D g2d = (Graphics2D)g;//抗锯齿RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);hints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);g2d.addRenderingHints(hints);//具体绘制 绘制多个圆圈AlgoVisHelper.setStrokewidth(g2d,1);for(MyCircle circle: circles) {if (!circle.isFilled){AlgoVisHelper.setColor(g2d,circle.color);AlgoVisHelper.strokeCircle(g2d, circle.x, circle.y, circle.getR());}else{AlgoVisHelper.setColor(g2d,circle.color);AlgoVisHelper.fillCircle(g2d, circle.x, circle.y, circle.getR());}}}@Overridepublic Dimension getPreferredSize(){return new Dimension(canvasWidth,canvasHeight);}}
}

AlgoVisHelper

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;/** 绘制工具类(辅助绘图)* 有许多具体绘制的方法*/public class AlgoVisHelper {private AlgoVisHelper(){}//设置线宽public static void setStrokewidth(Graphics2D g2d,int w){int strokeWidth = w;g2d.setStroke(new BasicStroke(strokeWidth,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));}//设置颜色public static void setColor(Graphics2D g2d,Color color){g2d.setColor(color);}//绘制线圆public static void strokeCircle(Graphics2D g2d,int x,int y,int r){Ellipse2D circle = new Ellipse2D.Double(x-r,y-r,2*r,2*r);g2d.draw(circle);}//绘制实心圆public static void fillCircle(Graphics2D g2d,int x,int y,int r){Ellipse2D circle = new Ellipse2D.Double(x-r,y-r,2*r,2*r);g2d.fill(circle);}public static void pause(int t){try{Thread.sleep(t);}catch (InterruptedException e){System.out.println("Error in sleeping!");}}//加入背景图片public static void putImage(Graphics2D g,int x,int y,String imageURL){ImageIcon icon = new ImageIcon(imageURL);Image image = icon.getImage();g.drawImage(image,x,y,null);}//绘制一个字符串public static void drawText(Graphics2D g,String text,int centerx,int centery){if(text == null)throw  new IllegalArgumentException("Text is null in drawText function");FontMetrics metrics = g.getFontMetrics();int w =metrics.stringWidth(text);int h = metrics.getDescent();g.drawString(text,centerx-w/2,centery+h);}
}

AlgoVisualizer

import javafx.scene.shape.Circle;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/** 控制层*/public class AlgoVisualizer {private MyCircle[] circles; //数据private  AlgoFrame frame;   //试图private  boolean isAnimated = true;public AlgoVisualizer(int sceneWidth,int sceneHeight,int N){//初始化数据circles = new MyCircle[N];int R = 50;for(int i=0;i<N;i++){int x = (int)(Math.random()*(sceneWidth-2*R)+R);int y = (int) (Math.random()*(sceneHeight-2*R)+R);int vx = (int) (Math.random()*11)-5;//生成-5到+5的一个随机数int vy = (int) (Math.random()*11)-5;int r = (int)(Math.random()*(256));int g = (int)(Math.random()*(256));int b = (int)(Math.random()*(256));Color color =  new Color(r, g, b);circles[i] = new MyCircle(x,y,R,vx,vy,color);}//初始化视图EventQueue.invokeLater(()->{frame = new AlgoFrame("CircleMoving Demo",sceneWidth,sceneHeight);//根据情况决定是否加入键盘鼠标事件监听器frame.addKeyListener(new AlgoKeyListener());frame.addMouseListener(new AlgoMouseListener());new Thread(()->{run();}).start();});}//动画逻辑private void run(){while(true){//绘制数据((AlgoFrame) frame).render(circles);AlgoVisHelper.pause(20);//更新数据if (isAnimated){for (MyCircle circle:circles)circle.move(0,0,frame.getCanvasWidth(),frame.getCanvasHeight());}}}//实现键盘你交互事件监听类private class AlgoKeyListener extends KeyAdapter {@Overridepublic void keyReleased(KeyEvent event){if (event.getKeyChar()==' ')isAnimated = !isAnimated;}}//实现鼠标你交互事件监听类private class AlgoMouseListener extends MouseAdapter{@Overridepublic void mousePressed(MouseEvent event){event.translatePoint(0,-(frame.getBounds().height-frame.getCanvasHeight()));//System.out.println(event.getPoint());for(MyCircle circle:circles)if (circle.contain(event.getPoint()))circle.isFilled=!circle.isFilled;}}public static void main(String[] args) {int sceneWidth = 800;int sceneHeight = 800;int N = 15;AlgoVisualizer vis = new AlgoVisualizer(sceneWidth,sceneHeight,N);}
}

一些提示

如何在屏幕内生成圆心的坐标?范围是多少?图示如下:

参考资料:

  • 详细内容来自《看得见的算法》教程 https://coding.imooc.com/class/138.html

【JavaGUI demo】swing仿Windows气泡屏保动画(含源码)相关推荐

  1. java微博系统源码_JAVA仿微博系统(JAVA毕业设计含源码和运行教程)

    前言 课设毕设源码收集已上传到github,包括:C,C#,C++,JAVA,PHP 等源码,更多源码在整理中.地址:https://github.com/52JDK/Source-Collectio ...

  2. macOS SwiftUI 教程之仿Safari浏览器地址栏(教程含源码)

    实战需求 macOS SwiftUI 教程之仿Safari浏览器地址栏 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 工具栏 .toolbar 搜索框 TextField ...

  3. C#实现气泡屏保(四个timer实现)

    四个timer实现气泡屏保 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  4. php气泡效果,js 模拟气泡屏保效果代码_其他特效

    核心代码: var T$ = function(id) { return document.getElementById(id); } var $extend = function(des, src) ...

  5. C#实现气泡屏保(1个timer实现)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. C#实现气泡屏保效果(用4个timer)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. c#第二课,气泡屏保

    回顾 属性赋值(4种) (1)直接赋值语法:15种数据类型 整数(8种) int uint short ushort long ulong- 浮点型(3种)double float decimal 布 ...

  8. Windows CE/Moblie截屏工具及实现源码

    Windows CE/Moblie截屏工具及实现源码 [img]http://dl2.iteye.com/upload/attachment/0084/6997/c72941f2-b86e-3683- ...

  9. HTML5响应式手机模板:电商网站设计——仿淘宝手机app界面模板源码 HTML+CSS+JavaScript...

    HTML5响应式手机模板:电商网站设计--仿淘宝手机app界面模板源码 HTML+CSS+JavaScript 手机电商模板 手机网站模板 企业手机网站模板 手机网站模板 手机模板 响应式手机网站 h ...

最新文章

  1. 微软宣布Azure Migrate和Site Recovery服务增强功能
  2. 如何使用adb命令发送keyevent
  3. leetcode1290. 二进制链表转整数 刷新认知,最简单算法题
  4. (计算机组成原理)第三章存储系统-第六节2:Cache和主存的映射方式(全相联映射、直接映射和组相连映射)
  5. PX4代码解析(5)
  6. 服务器 消息 208,在MSSQL2000里边 对象名 'sys.servers' 无效 服务器: 消息 208,级别 16,状态 1,行 1...
  7. 客服机器人代码_什么是第三方客服系统
  8. 程序人生:不知道我讲了什么的回应稿
  9. 史上最著名的电脑病毒
  10. 收款收据设计html,最新收款收据模板的格式
  11. html按钮圆弧样式,几款不错的按钮样式汇总
  12. eig()函数求特征值、特征向量、归一化
  13. infoq_InfoQ与Azul Systems Gil Tene谈论Zing,Zulu和新版本
  14. [渝粤教育] 长安大学 互换性与技术测量 参考 资料
  15. 使用JohnTheRipper对有密码加密的ZIP压缩包文件进行暴力破解
  16. Gradient vanishing and explosion
  17. 学习日志-勉励自己-自律
  18. Camera中onPreviewFrame()方法的视频方向旋转
  19. 解决谷歌浏览器打开后是毒霸浏览器的问题
  20. springboot+Zuul网关服务

热门文章

  1. 贝叶斯网络--概率推理
  2. 树莓派上的软件安装和卸载命令汇总
  3. 无损数据地将动态磁盘转换为基本磁盘
  4. k8s学习-思维导图与学习笔记
  5. 我的3D游戏开发书架 1
  6. C语言中宽字符和多字节字符
  7. 软件开发人员的个人成长与发展
  8. 【微服务】初识Docker
  9. 深入理解——字节、字符/字符串、Unicode 字符集
  10. ArcGIS流域水文分析丨转载