码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-11-22 13:56:37      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

此练习没有直接采用继承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的运行效果是不同的,前者显示的下雪场景总是有闪烁的感觉;后者则没有闪烁,个人感觉后者效果更好些。

技术分享

 

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

标签:

原文地址:http://www.cnblogs.com/wsw-tcsygrwfqd/p/4985701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!