标签:
此练习没有直接采用继承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的运行效果是不同的,前者显示的下雪场景总是有闪烁的感觉;后者则没有闪烁,个人感觉后者效果更好些。
标签:
原文地址:http://www.cnblogs.com/wsw-tcsygrwfqd/p/4985701.html