此練習沒有直接采用繼承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的運行效果是不同的,前者顯示的下雪場景總是有閃爍的感覺;后者則沒有閃爍,個人感覺后者效果更好些。

新聞熱點
疑難解答