初学多线程练习2--下雪效果

此练习没有直接采用继承Thread类或者继承Runnable的接口来实现多线程,而是使用了匿名内部类。

要导入的类:

1 import javax.swing.*;
2 import java.awt.*;

1.定义SowPanel类,继承JPanel类,这个类有两个整型数组成员,用来保存雪花起始位置。在构造函数中为数组赋初值;重写父类的paint()方法;定义一个启动多线程的startSnow()方法。

 1 class SnowPanel extends JPanel
 2 {
 3     //定义整型数组,存储雪花坐标
 4     private int[] x=new int[300];
 5     private int[] y=new int[300];
 6
 7     public SnowPanel()
 8     {
 9         //设置背景为黑色
10         setBackground(Color.black);
11         //用随机数初始化雪花坐标
12         for(int i=0;i<x.length;i++)
13         {
14             x[i]=(int)(Math.random()*800);
15             y[i]=(int)(Math.random()*600);
16         }
17     }
18
19     public void paint(Graphics g)
20     {
21         //继承父类画的方法
22         super.paint(g);
23         //设置颜色为白色
24         g.setColor(Color.white);
25         //利用循环画出多个雪花
26         for(int i=0;i<x.length;i++)
27         {
28             g.drawString("*",x[i],y[i]);
29         }
30     }
31     //定义一个方法启动多线程,并使用匿名内部类
32     public void startSnow()
33     {
34         new Thread()
35         {
36             public void run()
37             {
38                 while(true)
39                 {
40                     for(int i=0;i<y.length;i++)
41                     {
42                         //坐标下移
43                         y[i]++;
44                         //检查是否越界
45                         if(y[i]==600)
46                         y[i]=0;
47                         //重绘
48                         repaint();
49                     }
50
51                      try
52                      {
53                         Thread.sleep(10);
54                      }
55                          catch (InterruptedException e)
56                      {
57                         e.printStackTrace();
58                      }
59                 }
60             }
61         }.start();
62     }
63 }

2.定义ShowFrame类,继承Jframe 类。在构造方法中设置窗口的显示属性,并创建ShowPanel对象,添加到窗口中。

 1 class SnowPanel extends JPanel
 2 {
 3     //定义整型数组,存储雪花坐标
 4     private int[] x=new int[300];
 5     private int[] y=new int[300];
 6
 7     public SnowPanel()
 8     {
 9         //设置背景为黑色
10         setBackground(Color.black);
11         //用随机数初始化雪花坐标
12         for(int i=0;i<x.length;i++)
13         {
14             x[i]=(int)(Math.random()*800);
15             y[i]=(int)(Math.random()*600);
16         }
17     }
18
19     public void paint(Graphics g)
20     {
21         //继承父类画的方法
22         super.paint(g);
23         //设置颜色为白色
24         g.setColor(Color.white);
25         //利用循环画出多个雪花
26         for(int i=0;i<x.length;i++)
27         {
28             g.drawString("*",x[i],y[i]);
29         }
30     }
31     //定义一个方法启动多线程,并使用匿名内部类
32     public void startSnow()
33     {
34         new Thread()
35         {
36             public void run()
37             {
38                 while(true)
39                 {
40                     for(int i=0;i<y.length;i++)
41                     {
42                         //坐标下移
43                         y[i]++;
44                         //检查是否越界
45                         if(y[i]==600)
46                         y[i]=0;
47                         //重绘
48                         repaint();
49                     }
50
51                      try
52                      {
53                         Thread.sleep(10);
54                      }
55                          catch (InterruptedException e)
56                      {
57                         e.printStackTrace();
58                      }
59                 }
60             }
61         }.start();
62     }
63 }

3.运行效果图片(此为静态图):

疑问:发现其他的不改变,继承Frame、Panel和继承JFrame、Jpanel的运行效果是不同的,前者显示的下雪场景总是有闪烁的感觉;后者则没有闪烁,个人感觉后者效果更好些。

时间: 2025-01-13 18:39:38

初学多线程练习2--下雪效果的相关文章

关情纸尾-----Quartz2D定时器CADisplayLink下雪效果

定时器CADisplayLink下雪效果 1.定时器雪花整体思路: 先在控制器View面绘制一个雪花. 在View加载完毕后,添加一个定时器. 在定时器方法当中调用得绘方法. 在绘图方法当不段的去修改雪花的Y值. 当雪花的Y值超过屏幕的高度时,让雪花的Y值重新设为0.从最顶部开始. 2.添加定时器实现方案 第一种采用NSTime 第二种采用CADisplayLink 最终采用CADisplayLink方案. 2.1为什么采用CADisplayLink方案不用NSTime? 首先要了解setNee

再次推荐一款逼真的HTML5下雪效果

再次推荐一款逼真的下雪效果 效果图: 效果描述:之前推荐过一款下雪的jQuery插件之前的那款下降速度比较缓慢,今天推荐的这个下降速度比较快,大雪哇 使用方法:1.将index.html中的样式复制到你的样式表中2.将body中的代码部分拷贝到你需要的地方(注意保持图片.js文件路径的正确性) 查看效果:http://hovertree.com/texiao/jquery/36/ 下载地址 效果二 效果3 更多特效:http://www.cnblogs.com/roucheng/p/texiao

桌面下雪效果

一个简单的下雪效果 MainWindow: 1.主界面通过DispatcherTimer给Grid生成雪花 2.雪花飘落后再讲雪花从Grid容器中移除 public partial class MainWindow { public MainWindow() { InitializeComponent(); Closing += (s, e) => ViewModelLocator.Cleanup(); Loaded += MainWindow_Loaded; } private void Ma

强大的CSS:模拟下雪效果动画制作教程

下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥. 1.前言 由于公司产品的活动,需要模拟类似下雪的效果.浏览器实现动画无非css3和canvas(还有gif),对比下css3和canvas的优缺点: 动画自由度:canvas胜: 复杂度:canvas胜: 兼容性:canvas胜: 性能:css3胜(requestAnimationFrame和硬件加速). 由于对于性能有一定的要求,canvas对比css3会有更多的计算

CSS:模拟下雪效果动画制作教程

下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥. 1.前言 由于公司产品的活动,需要模拟类似下雪的效果.浏览器实现动画无非css3和canvas(还有gif),对比下css3和canvas的优缺点: 动画自由度:canvas胜: 复杂度:canvas胜: 兼容性:canvas胜: 性能:css3胜(requestAnimationFrame和硬件加速). 由于对于性能有一定的要求,canvas对比css3会有更多的计算

今年最后一场“雪”:下雪效果讲解

每年年底,特别是在圣诞节,各大网站都玩起了“下雪”.在这弄一个,纪念:今年的结束,新年的开始.也祝福大家在新的一年里越来越好. 先看看效果(如果乱码或者不能查看 复制下面的代码保存在本地查看) <!doctype html> <html> <head> <meta charset="UTF-8"> <title>下雪</title> <style type="text/css"> *

Cocos2d-x粒子系统 -- 实现下雪效果

先来说说我对粒子系统的了解吧,粒子系统是为了模仿自然世界的真实显现,比如说烟,雾,火花,闪电,火焰,下雪.粒子系统中需要包括四个部分:粒子对象,运动规律,随机性,粒子状态.大量的粒子叠加就可以产生我们需要的特效. 在Cocos2d-x中,实现粒子效果可以有三种方法,下面我一一道来. 1.代码自定义 使用这种方法,我们需要自己写代码,使用Cocos2d-x提供的CCParticleSystem来实现,使用这种方法,可以实现我们想要的任意效果. 这段文字的前面是雪花的图片,大家可能看不见,雪花是白的

c#初学-多线程中lock用法的经典实例

本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问

canvas 让你呼风唤雨,下雨下雪效果

前端如何呼风唤雨 Canvas 等于什么? = html5 =js = 取代flash =  你可以即见即所得向别人装逼!没错 进入 canvas 的权力游戏吧! 起初我创造了canvas . 我说,要有雨,就有了雨: 我说,要有雪,就有了雪. 而对于前端来说,canvas即是天地 在canvas这个天地上,前端可以呼风唤雨,无所不能. ------------------------------------华丽的分割线--------------------------------------