一、我的思路
- 在屏幕上画100~200个雪花,并记录每个雪花的位置
- 应用线程的run方法,增加每个雪花的Y轴坐标,然后重绘画布
1 import java.awt.*;
2 public class Snow{
3 public static void main(String args[]){
4 Frame w = new Frame();
5 w.setSize(1024,768);
6 w.setBackground(Color.black);
7
8 SnowPanel sp = new SnowPanel();
9 Thread t = new Thread(sp);
10 t.start();
11
12 w.add(sp);
13 w.setVisible(true);
14 }
15 }
16
17 class SnowPanel extends Panel implements Runnable{
18 int x = 30, y=30;
19 int[][] arr = new int[200][2];
20 public void paint(Graphics g){
21 for(int i=0;i<200;i++){
22 x = (int)(Math.random()*1024);
23 y = (int)(Math.random()*768);
24 arr[i]=new int[]{x,y};
25 }
26 g.setColor(Color.white);
27 for(int j=0;j<200;j++){
28 g.drawString("*", arr[j][0],arr[j][1]);
29 }
30 }
31 public void run(){
32
33 while(true){
34 for(int k=0;k<200;k++){
35 arr[k][1]=arr[k][1]+(int)(Math.random()*70);
36 // 打印每个雪花的X轴和Y轴坐标
37 // System.out.println("arr["+k+"]"+arr[k][0]+" "+arr[k][1]);
38 if(arr[k][1]>768){
39 arr[k][1]=0;
40 }
41 }
42 try{
43 Thread.sleep((int)(Math.random()*30));
44 Thread.sleep(300);
45 }catch(Exception e){}
46 repaint();
47 }
48 }
49
50 }
【运行结果】雪花没有形成下落的感觉,而只是每个雪花都随机变换了位置。
【原因分析】梳理代码并输出雪花坐标发现:每次重绘,200个雪花都被重新赋予了坐标值,没有按预期的X轴不变、Y轴增加。
【解决方案】因为paint()和while中的代码总是在重复执行,因此,为了确保雪花的初始值存入数组后就不变化,将此段代码放到run()方法的while(trun)之前。
二、修改代码如下
1 import java.awt.*;
2 public class Snow{
3 public static void main(String args[]){
4 Frame w = new Frame();
5 w.setSize(1024,768);
6 w.setBackground(Color.black);
7
8 SnowPanel sp = new SnowPanel();
9 Thread t = new Thread(sp);
10 t.start();
11
12 w.add(sp);
13 w.setVisible(true);
14 }
15 }
16
17 class SnowPanel extends Panel implements Runnable{
18 int x = 30, y=30;
19 int[][] arr = new int[200][2];
20 public void paint(Graphics g){
21 g.setColor(Color.white);
22 for(int j=0;j<200;j++){
23 g.drawString("*", arr[j][0],arr[j][1]);
24 }
25 }
26
27 public void run(){
28 for(int i=0;i<200;i++){
29 x = (int)(Math.random()*1024);
30 y = (int)(Math.random()*768);
31 arr[i]=new int[]{x,y};
32 }
33 while(true){
34 for(int k=0;k<200;k++){
35 arr[k][1]=arr[k][1]+(int)(Math.random()*50);
36 // 打印每个雪花的X轴和Y轴坐标
37 // System.out.println("arr["+k+"]"+arr[k][0]+" "+arr[k][1]);
38 if(arr[k][1]>768){
39 arr[k][1]=0;
40 }
41 }
42 try{
43 //Thread.sleep((int)(Math.random()*30));
44 Thread.sleep(300);
45 }catch(Exception e){}
46 repaint();
47 }
48 }
49
50 }
【运行结果】雪花形成了下落的效果,只是每次重绘,屏幕都要闪烁一次,好像没有那么连贯。。不过,总体是可以接受的啦!~ 直到看到老师的版本。
二、老师的方案
因为雪花的位置需要初始化且需要存储,老师引入了构造方法。
代码一
【运行效果】编译报错,构造方法不正确
【原因分析】构造方法的名字写错,没有与类名保持一致。
代码二
【运行结果】背景没生效,且没有雪花。
【原因分析】背景色不应该设置在Panel上?
代码三
【运行结果】背景颜色生效了,但是依然没有雪花。。。
【原因分析】是不是还是背景色设置的位置不对呀?
代码四
【运行结果】背景色由失效了,且依然没有雪花。。。
【原因分析】啊! SnowPanelT对象没有添加至窗体呀!!!
代码五
【运行结果】背景色终于生效了,且有雪花。。。但是。。。雪花没动。。。
【原因分析】打印雪花的X轴、Y轴坐标值试试。。
代码六
【运行结果】雪花X轴、Y轴坐标值只打印了一次!
【原因分析】也就是说,for循环执行一次就完事了。。。
代码七
【运行结果】雪花动了,但是动到底就没了。。。而且整体往左下方偏。
【原因分析】没有做边界值设定!去掉X轴的变化,只对Y轴坐标做限定。
代码八 - 终极版
1 import java.awt.*;
2
3 public class SnowT{
4 public static void main(String args[]){
5 Frame w = new Frame();
6 w.setSize(1024,768);
7 //w.setBackground(Color.BLACK);
8
9 SnowPanelT spt = new SnowPanelT();
10 //spt.setBackground(Color.black);
11 w.add(spt);
12
13 Thread t = new Thread(spt);
14 t.start();
15
16 w.setVisible(true);
17
18 }
19 }
20
21 class SnowPanelT extends Panel implements Runnable{
22 int[] xArr = new int[200];
23 int[] yArr = new int[200];
24 public SnowPanelT(){
25 this.setBackground(Color.black);
26 for(int i=0;i<200;i++){
27 xArr[i]=(int)(Math.random()*1024);
28 yArr[i]=(int)(Math.random()*768);
29 }
30 }
31
32 public void paint(Graphics g){
33 g.setColor(Color.white);
34 for(int j=0;j<200;j++){
35 g.drawString("*",xArr[j],yArr[j]);
36 }
37 }
38
39 public void run(){
40 while(true){
41 for(int k=0;k<200;k++){
42 yArr[k]=yArr[k]+(int)(Math.random()*50);
43 if(yArr[k]>768){
44 yArr[k]=0;
45 }
46 System.out.println(xArr[k]+" "+yArr[k]);
47 }
48 try{
49 Thread.sleep(200);
50 }catch(Exception e){}
51 repaint();
52 }
53 }
54 }
【运行结果】完美展现了下大雪的效果。。。