Java語言是目前為止最新、推廣最快的一種新型面向對象程序設計語言,由於Java具有面向對象、平台無關性、穩固性與安全性、多線程等特性,從而為用戶提供了一個良好的程序設計環境。它利用面向對象方法,提供了一組用於圖形用戶界面(GUI)開發的類,這些類包含在抽象窗口工具集(Abstract Windows Toolkit,簡稱AWT)中。利用這些類,我們可以非常方便地設計出與平台無關、界面友好的應用程序。但由於Java目前還不支持漢字,因此我們選用支持Java語言的中文Windows 95平台來設計漢字動畫程序。下面即是一個簡單的示例程序。
我們知道,Java設計的程序分為兩種:一類是由Java解釋器解釋執行的Java應用;另一類是必須嵌入到Web頁中,由Java兼容浏覽器(如:Sun公司的Hotjava、Netscape的Navigator)來控制執行的JavaApplet;下面的程序即是一個必須嵌入到Web頁中的Applet。Applet有其固定的程序框架。它要求在主事件中至少實現下列五種方法之一:
初始化方法init():創建對象、設置初始狀態、參數等
啟動方法start():啟動Applet開始運行
停止方法stop():停止Applet運行
刪除方法destroy():殺死Applet所有正在運行的線程,釋放對象
繪制方法paint():在屏幕上顯示信息
在本例Applet中,實現了start()、stop和paint()三種方法。
在實際應用中,應用程序往往需要同時處理多個事件,如,一方面進行圖形顯示,另一方面接收用戶輸入。在不支持多線程的情況下,我們只能依次完成每個事件。在支持多線程的Java中,就可以創建一個線程專門用來進行圖形顯示,而在主事件中接收用戶輸入,兩者並發執行。創建線程必須實現線程類(Thread)的run()方法,運行系統通過調用run()方法來實現線程的行為。
下面,我們來看例子程序myAnimator.java。在Java中,沒有類就無法運行程序。我們建立了一個Applet類的子類myAnimator,並實現了Runnable界面。實現Runnable界面的目的是為了創建線程。線程體定義在run()方法中,循環地調用repaint()方法,然後調用sleep()方法使線程睡眠delayTime時間。睡眠時間到,線程又被喚醒,再次執行循環體。repaint()方法調用了paint()方法。在paint()方法中,先設置字型及大小,再根據變量flag值為0、1、2、3,設置顏色為紅、綠、黃、藍四種顏色之一。調用draw?String()方法在屏幕上輸出漢字串。然後使flag值加一。若falg大於3,把flag置為0。程序開始執行時,先啟動start()方法,在start()方法中啟動線程,在屏幕上以紅、綠、黃、藍四種顏色循環顯示漢字串,實現了動畫顯示。
為了運行這個Applet,必須把它嵌入到Web頁中。我們編寫了一個簡單的HTML文件myAnimator.html。CODE屬性指定Applet的文件名為myAnimator.class。WIDTH和HEIGHT分別指定了Applet的顯示寬度和高度。然後在中文Windows95的DOS模式下,用如下命令來編譯:
c:\hotjava\bin\javacmyAnimator.java
編譯通過後,生成myAnimator.class字節碼文件。這時即可用浏覽Applet的工具appletviewer來浏覽該HTML,命令如下:
c:\hotjava\bin\appletviewermyAnimator.html
需要注意的一點是,在支持長文件名的Windows95下,保留大小寫但不區分大小寫。而Java是區分大小寫的,而且文件名需與類名相同。
源程序myAnimator.java
//漢字動畫APPLET
//WritedbyLJY1997.6.20
importjava.awt. :
publicclassmyAnimatorextendsjava.applet.AppletimplementsRunnable
{intdelayTime=100;//線程睡眠時間
intflag=0;
Threadanimator;//定義線程
Fontf=newFont(″TimesRoman″,Font.BOLD,48);//創建字型類實例
Stringname=″漢字動畫演示″;
publicvoidstart()
{animator=newThread(this);//創建線程
animator.start();//啟動線程}
publicvoidrun()//線程體
{while(animator!=null)//如果線程已創建,循環執行
{repaint();//向屏幕輸出
try{
Thread.sleep(delayTime);//線程睡眠
}catch(InterruptedExceptione){
break;}
}}
publicvoidstop()
{animator.stop();//停止線程
animator=null;}
publicvoidpaint(Graphicsg)
{g.setFont(f);//設置字型及大小
switch(flag)
{
case0:g.setColor(Color.red);
break;
case1:g.setColor(Color.green);
break;
case2:g.setColor(Color.yellow);
break;
case3:g.setColor(Color.blue);
break;
}
g.drawString(this.name,5,50);
flag++;
if(flag>3)flag=0;
}}
HTML文件:myAnimator.html
〈appletcode=myAnimator.classwidth=300height=80〉
〈/applet〉