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

来源:互联网 发布:淘宝五心要多少信誉 编辑:程序博客网 时间:2024/05/05 08:25
此练习没有直接采用继承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                      try52                      {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 public class SnowFrame extends JFrame 2 { 3     public SnowFrame() 4     { 5         setTitle("满天雪花"); 6         //设置窗体显示坐标和大小 7         setBounds(100,100,800,600); 8         //设置用户在此窗体上发起close时默认的操作 9         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);10         //设置此窗体不可被调整大小11         setResizable(false);12         SnowPanel p=new SnowPanel();13         //调用能够启动线程的方法14         p.startSnow();15         //把SnowPanel对象添加到此窗体上16         this.add(p);17         this.setVisible(true);18     }19     public static void main(String[] args)20     {new SnowFrame();}21 }

 

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

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

 

0 0
原创粉丝点击