一、我的思路
- 在屏幕上画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 public void run(){ 27 for(int i=0;i<200;i++){ 28 x = (int)(Math.random()*1024); 29 y = (int)(Math.random()*768); 30 arr[i]=new int[]{x,y}; 31 } 32 while(true){ 33 for(int k=0;k<200;k++){ 34 arr[k][1]=arr[k][1]+(int)(Math.random()*50); 35 // 打印每个雪花的X轴和Y轴坐标 36 // System.out.println("arr["+k+"]"+arr[k][0]+" 37 38 "+arr[k][1]); 39 if(arr[k][1]>768){ 40 arr[k][1]=0; 41 } 42 } 43 try{ 44 Thread.sleep((int)(Math.random()*30)); 45 Thread.sleep(300); 46 }catch(Exception e){} 47 repaint(); 48 } 49 } 50 51 }
编译并运行,结果如下
雪花形成了下落的效果,只是每次重绘,屏幕都要闪烁一次,好像没有那么连贯。。不过,总体是可以接受的啦!