版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章圖形界面4.1Applet與圖形界面4.2圖形輸出4.3圖形用戶界面設(shè)計(jì)4.4圖形界面應(yīng)用程序
4.1Applet與圖形界面
4.1.1案例1:顯示圖像文件的Applet
前面各章大部分例子都是Java應(yīng)用程序。Java應(yīng)用程序可通過System.out向標(biāo)準(zhǔn)輸出設(shè)備輸出文本,而Java小程序不能通過此種方法輸出信息。Java小程序在瀏覽器中運(yùn)行,占據(jù)頁面中的一塊矩形區(qū)域,信息的輸出必須通過Java語言提供的圖形功能畫在此矩形區(qū)域。
本節(jié)案例要求實(shí)現(xiàn)一個(gè)Applet,先顯示一幅圖像文件,單擊該圖像后,將顯示另一幅圖像。圖4.1和圖4.2為使用JBuilder調(diào)試程序的運(yùn)行畫面。圖4.1顯示第一幅圖像圖4.2單擊后顯示第二幅圖像4.1.2Applet程序結(jié)構(gòu)
Applet程序在支持Java的Web瀏覽器中執(zhí)行,它的結(jié)構(gòu)不同于Java應(yīng)用程序。每一個(gè)Applet都有一個(gè)主類,派生自java.applet.Applet。
與Java應(yīng)用程序不同,在Applet程序中看不到明顯的程序執(zhí)行流程。在第1章Applet的例子中,只寫了一個(gè)paint方法,該方法與應(yīng)用程序的main方法不同。當(dāng)paint方法執(zhí)行結(jié)束后,Applet并沒有中止執(zhí)行,而當(dāng)Applet需要重新繪制時(shí),paint方法再次被調(diào)用。實(shí)際上,Applet的執(zhí)行流程在其超類java.applet.Applet中已確定,當(dāng)需要繪制Applet占據(jù)的矩形空間時(shí),即調(diào)用paint方法,而在我們所寫的Applet中已覆蓋了原Applet類中定義的paint方法,因此當(dāng)需要繪制Applet時(shí),派生類中定義的paint即被調(diào)用。
在Applet類中定義了幾個(gè)重要的方法,這幾個(gè)方法在Applet整個(gè)運(yùn)行的生命周期中具有特殊的作用,在編寫Applet時(shí)應(yīng)根據(jù)需要覆蓋對(duì)應(yīng)的方法。下面簡(jiǎn)要介紹這幾種方法。
1)?publicvoidinit()
init方法的作用是初始化。在整個(gè)Applet生命周期中,初始化只進(jìn)行一次。當(dāng)Web瀏覽器第一次瀏覽含有Applet的網(wǎng)頁時(shí),瀏覽器首先下載該Applet字節(jié)碼文件,然后創(chuàng)建一個(gè)該Applet主類的對(duì)象,再調(diào)用init方法對(duì)Applet自身進(jìn)行初始化。
在init方法中可設(shè)置程序初始狀態(tài),載入圖形或字體,獲取HTML中<param>設(shè)定的參數(shù)等。案例1的Applet需要顯示服務(wù)器上的圖片文件,圖片的下載可安排在init方法中進(jìn)行。
2)?publicvoidstart()
start方法在Applet啟動(dòng)時(shí)被調(diào)用。在整個(gè)Applet生命周期中,啟動(dòng)可發(fā)生多次。當(dāng)Applet第一次被裝入并初始化后,或者離開該頁面后再次進(jìn)入時(shí),瀏覽器都會(huì)調(diào)用start方法??梢栽趕tart方法中通知Applet開始運(yùn)行。
3)?publicvoidstop()
stop方法用于停止執(zhí)行Applet。在整個(gè)Applet生命周期中,停止執(zhí)行可發(fā)生多次。當(dāng)瀏覽器離開Applet所在Web頁或關(guān)閉時(shí),瀏覽器將調(diào)用stop方法。
stop方法掛起小程序,可在stop方法中釋放系統(tǒng)資源,否則當(dāng)瀏覽者離開一個(gè)頁面時(shí),小程序還將繼續(xù)運(yùn)行。
4)?publicvoiddestroy()
destroy方法在Applet退出時(shí)被調(diào)用。在整個(gè)Applet生命周期中,退出只發(fā)生一次,即結(jié)束對(duì)該Web頁的訪問關(guān)閉Web瀏覽器時(shí)調(diào)用一次。
可在destroy方法中編寫釋放系統(tǒng)資源的代碼,但除非用了特殊的資源(如創(chuàng)建的線程),否則一般不需重寫destroy方法,因?yàn)镴ava運(yùn)行系統(tǒng)本身會(huì)自動(dòng)進(jìn)行“垃圾”處理和內(nèi)存
管理。
5)?publicvoidpaint(Graphicsg)
paint方法負(fù)責(zé)繪制Applet的顯示區(qū)域,可發(fā)生多次。當(dāng)需要刷新Applet顯示時(shí),自動(dòng)調(diào)用該方法。如果程序中修改了數(shù)據(jù)需要刷新顯示,可用repaint方法強(qiáng)制系統(tǒng)調(diào)用paint方法重新繪制。
與前幾個(gè)方法不同的是,paint中帶有一個(gè)參數(shù)Graphicsg,它表明paint方法需要引用一個(gè)Graphics類的對(duì)象。在Applet中不用編程者操心,瀏覽器會(huì)自動(dòng)創(chuàng)建Graphics對(duì)象并將其傳送給paint方法,但應(yīng)在Applet程序中引入Graphics類:
importjava.awt.Graphics;程序4.1演示了Applet的幾個(gè)重要方法,該程序使用System.out輸出部分信息,這部分信息在Applet中無法看到。使用appletviewer調(diào)試Applet時(shí)可以通過程序菜單打開Java顯示控制臺(tái)觀察到這部分信息。下面是某次運(yùn)行時(shí)的輸出結(jié)果,讀者可從中看出上面幾個(gè)重要方法被調(diào)用的順序:
Nowinit
Nowstart
Nowpaint
Nowpaint
Nowstop
Nowdestroy【程序4.1】Applet幾個(gè)重要方法的調(diào)用順序。
//AppletLife.java:
importjava.awt.*;
importjava.applet.Applet;
publicclassAppletLifeextendsApplet
{
publicvoidinit()
{
System.out.println("Nowinit");
}publicvoidstart()
{
System.out.println("Nowstart");
}
publicvoidstop()
{
System.out.println("Nowstop");
}
publicvoidpaint(Graphicsg)
{
System.out.println("Nowpaint"); g.drawString("hello",30,30);
}
publicvoiddestroy()
{
System.out.println("Nowdestroy");
}
}4.1.3圖像文件的下載
java.awt.Graphics類提供了不少繪制圖形的方法,但如果用它們?cè)贏pplet運(yùn)行過程中實(shí)時(shí)地繪制一幅較復(fù)雜的圖形則并不容易。對(duì)于復(fù)雜圖形,一般事先用專用的繪圖軟件繪制好,或者是用其他截取圖像的工具(如掃描儀)獲取圖像的數(shù)據(jù)信息,按一定的格式存入圖像文件。案例1要求顯示兩幅圖像,Applet程序運(yùn)行時(shí),只需從指定位置將圖像文件裝載到內(nèi)存里,然后在適當(dāng)?shù)臅r(shí)機(jī)將它顯示出來。
Java目前所支持的圖像文件格式有兩種,分別是GIF和JPEG格式(帶有?.GIF、.JPG、.JPEG后綴名的文件)。如果是其他格式的圖像文件,可用圖像處理軟件先將它們轉(zhuǎn)換為這兩種格式。
Applet類提供了getImage方法,用以將準(zhǔn)備好的圖像文件裝載到Applet中。該方法的參數(shù)指明了圖像文件所存儲(chǔ)的位置。由于Java語言是面向網(wǎng)絡(luò)應(yīng)用的,大部分情況是直接存取網(wǎng)絡(luò)中Web服務(wù)器上的圖像文件,因此Java采用URL(UniversalResourceLocation,統(tǒng)一資源定位器)來定位圖像文件的網(wǎng)絡(luò)位置,并定義URL類來管理URL信息(有關(guān)URL類的詳細(xì)內(nèi)容可參考本書第8章)。
getImage方法有兩種調(diào)用格式:
ImagegetImage(URLurl)
ImagegetImage(URLurl,Stringname)第一種格式使用絕對(duì)URL形式,它指明了網(wǎng)絡(luò)資源的全路徑名,例如:
/java/imgsample/images/m1.gif
第二種格式使用相對(duì)URL形式,由基準(zhǔn)URL(baseURL)再加上相對(duì)于基準(zhǔn)URL下的相對(duì)URL兩部分組成,例如上面的例子可表示為基準(zhǔn)URL:
/java/imgsample/
與相對(duì)URL:
images/m1.gif
兩部分。如果從當(dāng)前Applet所在的網(wǎng)站裝載圖像文件,通常無需特意創(chuàng)建URL對(duì)象,可使用Applet類提供的兩個(gè)方法來獲取基準(zhǔn)URL對(duì)象,然后給出圖像文件的相對(duì)路徑就可以了。這兩個(gè)方法是:
URLgetDocumentBase()
URLgetCodeBase()
getDocumentBase()方法返回的基準(zhǔn)URL對(duì)象代表了包含該Applet的HTML文件所處的目錄,例如該文件存儲(chǔ)在“/java/imgsample/m1.html”中,則該方法就返回“/java/imgsample/”路徑。
getCodeBase()方法返回的基準(zhǔn)URL對(duì)象代表了該Applet文件(?.class文件)所處的目錄。
getImage方法的返回值為Image對(duì)象,Java特別提供了java.awt.Image類來管理與圖像文件有關(guān)的信息,執(zhí)行與圖像文件有關(guān)的操作應(yīng)引入該類。
getImage方法將圖像文件從網(wǎng)絡(luò)上裝入,交由Image對(duì)象管理。【程序4.2】案例1初步實(shí)現(xiàn)。
//下載圖像文件
importjava.applet.*;
import.URL;
importjava.awt.Image;
publicclassshowPicextendsAppletimplementsjava.awt.event.MouseListener{
privateStringImageFile[]={“IMG_1.JPG”,“IMG_2.JPG”}; //圖像文件名
privateImageAdImage[]=newImage[2]; //Image對(duì)象
publicvoidinit()
{
URLcodeBase=getCodeBase(); //獲取基準(zhǔn)URL
for(inti=0;i<2;i++)
AdImage[i]=getImage(codeBase,ImageFile[i]);
//從網(wǎng)站裝載圖像文件
}
}4.1.4圖像的輸出
Graphics類提供了drawImage方法將Image對(duì)象中的圖像顯示在特定位置上,調(diào)用格式如下:
booleandrawImage(Imageimg,intx,inty,ImageObserverobserver)
其中:img參數(shù)是要顯示的Image對(duì)象;x和y參數(shù)是該圖像左上角的坐標(biāo)值;observer參數(shù)則是一個(gè)ImageObserver接口(interface)類型的對(duì)象,用來跟蹤圖像文件裝載是否已經(jīng)完成的情況,在Applet中可傳遞當(dāng)前Applet對(duì)象的引用。除了將圖像文件照原樣輸出以外,drawImage()方法的另一調(diào)用格式還能指定圖像顯示的區(qū)域大?。?/p>
booleandrawImage(Imageimg,intx,inty,intwidth,intheight,ImageObserverobserver)
這種格式多了兩個(gè)參數(shù)width和height,分別表示圖像顯示的寬度和高度。若實(shí)際圖像的寬度和高度與這兩個(gè)參數(shù)值不一樣,Java系統(tǒng)會(huì)自動(dòng)將它進(jìn)行縮放,以適合指定的矩形區(qū)域。為了不使圖像因縮放而變形失真,可以將原圖的寬和高均按相同的比例進(jìn)行縮小或放大。原圖的大小只需調(diào)用Image類中的兩個(gè)方法就可以得到,它們的格式如下:
intgetWidth(ImageObserverobserver) //獲取原圖寬度
intgetHeight(ImageObserverobserver) //獲取原圖高度
同drawImage方法一樣,通常用this作為observer的參數(shù)值。
程序4.3給出了案例1進(jìn)一步的實(shí)現(xiàn),運(yùn)行該程序可以顯示出第一幅圖像。drawImage方法被調(diào)用時(shí)observer參數(shù)的實(shí)參為this,即當(dāng)前的Applet?!境绦?.3】案例1的改進(jìn)。
importjava.applet.*;
importjava.awt.event.MouseEvent;
import.URL;
importjava.awt.Image;
importjava.awt.Graphics;
publicclassshowPicextendsApplet{
privateStringImageFile[]={"IMG_0277.JPG","IMG_0281.JPG"};
privateImageAdImage[]=newImage[2];privateintCurPic=0; //當(dāng)前顯示的圖像編號(hào)
publicvoidinit()
{
URLcodeBase=getCodeBase();
for(inti=0;i<2;i++)
AdImage[i]=getImage(codeBase,ImageFile[i]);
}
publicvoidpaint(Graphicsg)
{
g.drawImage(AdImage[CurPic],0,0,this);
}
}4.1.5事件的響應(yīng)
從前面的例子可以看出,JavaApplet小程序與Java應(yīng)用程序在結(jié)構(gòu)上有很大差異。Java應(yīng)用程序有一個(gè)main方法順序執(zhí)行,當(dāng)執(zhí)行到輸入數(shù)據(jù)的語句時(shí),程序等待用戶從鍵盤輸入數(shù)據(jù)。用戶輸入數(shù)據(jù)后,程序繼續(xù)執(zhí)行,如果main方法執(zhí)行結(jié)束,則程序終止運(yùn)行。而JavaApplet似乎一直在執(zhí)行,程序員無法知道用戶什么時(shí)候按下鼠標(biāo)按鈕,不可能像應(yīng)用程序那樣等待用戶的輸入動(dòng)作。
JavaApplet采用事件驅(qū)動(dòng)的方法來接受用戶的輸入,事件表達(dá)了程序、系統(tǒng)及使用程序的用戶之間的動(dòng)作。JavaApplet啟動(dòng)運(yùn)行后,超類中控制程序運(yùn)行的代碼會(huì)在適當(dāng)?shù)臅r(shí)候檢測(cè)到用戶的輸入動(dòng)作,根據(jù)動(dòng)作的不同調(diào)用不同方法或由指定的對(duì)象來處理該事件。因此要響應(yīng)鼠標(biāo)按鈕按下的動(dòng)作,Applet需要做兩件事:一是通知Applet當(dāng)鼠標(biāo)按鈕按下后調(diào)用哪一個(gè)方法或由哪一個(gè)對(duì)象來處理,二是在該方法或指定對(duì)象的某個(gè)方法中實(shí)現(xiàn)所要完成的功能。
1.事件響應(yīng)的一般方法
Java1.0?采用的方法比較簡(jiǎn)單,它預(yù)先在超類中指定了當(dāng)發(fā)生某個(gè)事件時(shí)要調(diào)用的方法,只需在派生類中覆蓋這些方法就可以實(shí)現(xiàn)事件的響應(yīng)了。這種方法簡(jiǎn)單但缺乏靈活性,Java1.1以后的版本不再推薦使用,本書也不再贅述。
Java1.1及以后的版本中,事件處理采用委托模型,在程序中可以委托某一個(gè)對(duì)象處理特定的事件,該對(duì)象必須實(shí)現(xiàn)了指定的事件監(jiān)聽器接口。當(dāng)Applet檢測(cè)到某一個(gè)事件時(shí),即通知該對(duì)象調(diào)用指定的方法來處理該事件。因此要處理某一事件至少需要完成下面兩件事:
(1)定義一個(gè)類實(shí)現(xiàn)事件監(jiān)聽器接口。如果希望響應(yīng)鼠標(biāo)按下事件,則需實(shí)現(xiàn)MouseListener接口。
(2)登記事件監(jiān)聽器接口,即委托某個(gè)實(shí)現(xiàn)了監(jiān)聽器接口的類對(duì)象處理指定事件。例如響應(yīng)鼠標(biāo)事件可采用Applet類的addMouseListener方法:
addMouseListener(obj);
這里obj應(yīng)是(1)中所定義類的對(duì)象。
當(dāng)然,如果不再需要監(jiān)聽該事件,也可以移去事件監(jiān)聽器。移去事件監(jiān)聽器可采用Applet的removeMouseListener方法:
removeMouseListener(obj);這里的obj應(yīng)與addMouseListener調(diào)用的參數(shù)為同一個(gè)對(duì)象。
不同類別的事件需要實(shí)現(xiàn)不同的事件接口,如果需要響應(yīng)其他類型的事件,只需實(shí)現(xiàn)對(duì)應(yīng)的接口,并使用對(duì)應(yīng)的方法成員向事件監(jiān)聽器登記。Java1.1以后版本事件處理相關(guān)的類在包java.awt.event中,可使用import語句引入需要的類和接口:
importjava.awt.event.*;
2.鼠標(biāo)事件的響應(yīng)
鼠標(biāo)事件處理模式實(shí)現(xiàn)的事件接口為MouseListener和MouseMotionListener。MouseListener主要響應(yīng)鼠標(biāo)的點(diǎn)擊事件,包含5個(gè)方法成員,分別響應(yīng)不同的鼠標(biāo)事件:
publicvoidmousePressed(MouseEvente); //按下鼠標(biāo)
publicvoidmouseReleased(MouseEvente); //鼠標(biāo)按鈕被釋放
publicvoidmouseEntered(MouseEvente); //鼠標(biāo)進(jìn)入監(jiān)聽的組件
publicvoidmouseExited(MouseEvente); //鼠標(biāo)離開監(jiān)聽的組件
publicvoidmouseClicked(MouseEvente); //鼠標(biāo)單擊
登記和移除MouseListener分別使用方法addMouseListener和removeMouseListener。
接口MouseMotionListener用于響應(yīng)鼠標(biāo)的移動(dòng)事件:
publicvoidmouseDragged(MouseEvente); //鼠標(biāo)拖動(dòng)
publicvoidmouseMoved(MouseEvente); //鼠標(biāo)移動(dòng)
登記和移除MouseMotionListener分別使用方法addMouseMotionListener和removeMouseMotionListener。可以通過MouseEvent類中定義的方法getX、getY獲取事件發(fā)生時(shí)鼠標(biāo)的x、y坐標(biāo),或使用方法getPoint,該方法返回一個(gè)Point類型的對(duì)象。
程序4.4是案例1功能的完整實(shí)現(xiàn),該例的Applet派生類showPic直接實(shí)現(xiàn)了MouseListner,因此在登記事件監(jiān)聽器時(shí)直接使用this參數(shù),即當(dāng)前Applet負(fù)責(zé)事件的處理,而無需另外創(chuàng)建對(duì)象?!境绦?.4】案例1的實(shí)現(xiàn)。
importjava.applet.*;
importjava.awt.event.MouseEvent;
import.URL;
importjava.awt.Image;
importjava.awt.Graphics;
publicclassshowPicextendsAppletimplementsjava.awt.event.MouseListener{
privateStringImageFile[]={"IMG_1.JPG","IMG_2.JPG"};privateImageAdImage[]=newImage[2];
privateintCurPic=0;
publicvoidinit()
{
URLcodeBase=getCodeBase();
for(inti=0;i<2;i++)
AdImage[i]=getImage(codeBase,ImageFile[i]);
}
publicvoidstart()
{
addMouseListener(this);}
publicvoidstop()
{
removeMouseListener(this);
}
publicvoidpaint(Graphicsg)
{
g.drawImage(AdImage[CurPic],0,0,this);
}
publicvoidmouseClicked(MouseEvente){
CurPic=(CurPic+1)%2;repaint();
}
publicvoidmousePressed(MouseEvente){
}
publicvoidmouseReleased(MouseEvente){
}
publicvoidmouseEntered(MouseEvente){
}
publicvoidmouseExited(MouseEvente){
}
}
3.事件適配器
程序4.4中只響應(yīng)鼠標(biāo)單擊事件,但是為了實(shí)現(xiàn)MouseListener接口必須實(shí)現(xiàn)5個(gè)方法,而MousePressed等4個(gè)方法對(duì)程序4.4來說沒有實(shí)際意義。為了減少類似這種情況的不必要的代碼,Java類庫提供了事件適配器,使用內(nèi)部類或匿名類配合事件適配器去監(jiān)聽事件,則僅僅需要重寫要實(shí)現(xiàn)的方法即可。有關(guān)內(nèi)部類及匿名類的詳細(xì)語法這里不詳細(xì)介紹,僅簡(jiǎn)單介紹如何使用匿名類實(shí)現(xiàn)事件的監(jiān)聽。
匿名類沒有名字,只會(huì)使用一次。下面的代碼創(chuàng)建一個(gè)匿名類對(duì)象,該匿名類派生自MouseMotionAdapter類,并覆蓋了其mouseDragged方法。
newMouseMotionAdapter(){//匿名類開始
publicvoidmouseDragged(MouseEvente)
{
Strings=“Mousedragging:x=”+e.getX()+“Y”+e.getY();tf.setText(s);
}
}
這里的MouseMotionAdapter就是一個(gè)事件適配器,對(duì)應(yīng)MouseMotionListener。java.awt.event包中定義的鼠標(biāo)事件適配器還有MouseAdapter,對(duì)應(yīng)MouseListener接口。程序4.5給出了使用事件適配器實(shí)現(xiàn)案例1的代碼。
【程序4.5】使用事件適配器實(shí)現(xiàn)案例1。
importjava.applet.*;
importjava.awt.event.*;
import.URL;
importjava.awt.Image;
importjava.awt.Graphics;
publicclassshowPicextendsApplet{
privateStringImageFile[]={"computer.gif","forest1.gif"};privateImageAdImage[]=newImage[2];
privateintCurPic=0;
publicvoidinit()
{
URLcodeBase=getCodeBase();
for(inti=0;i<2;i++)
AdImage[i]=getImage(codeBase,ImageFile[i]);
//從網(wǎng)站裝載圖像文件
}
publicvoidstart(){
addMouseListener(newMouseAdapter()
{
publicvoidmouseClicked(MouseEvente){
CurPic=(CurPic+1)%2;
repaint();
}
}
);}
publicvoidpaint(Graphicsg)
{
g.drawImage(AdImage[CurPic],0,0,this);
}
}4.1.6在HTML中使用Applet
Applet使用appletviewer或Web瀏覽器加載運(yùn)行,是通過HTML中定義的<APPLET>標(biāo)記來實(shí)現(xiàn)的。第1章程序1.2中的HTML文件使用的是APPLET標(biāo)記最簡(jiǎn)單的一種形式,APPLET標(biāo)記更一般的形式如下:
<applet
codebase=codebaseURL
archive=archiveList
code=appletFile
alt=alternateText
name=appletInstanceName
width=pixelsheight=pixels
vspace=pixelshspace=pixels
align=alignment>
</applet>
APPLET標(biāo)記本身不區(qū)分大小寫,上面黑體字部分為APPLET標(biāo)記必需的部分。下面介紹APPLET標(biāo)記中屬性的含義。●?codebase屬性:定義JavaApplet字節(jié)碼文件的路徑或地址(URL)。當(dāng)Applet與HTML文檔不在同一目錄時(shí)用它來定位字節(jié)碼文件,如果沒有該屬性,則表示Applet程序的字節(jié)碼文件和HTML文檔放在同一目錄。
●?code屬性:指定調(diào)用的JavaApplet程序字節(jié)碼文件名,要注意全名和大小寫。
●?archive屬性:用逗號(hào)分隔的JAR文件列表。若Applet程序由多個(gè)類構(gòu)成,可以將多個(gè)class文件打包生成JAR文件,以方便程序的發(fā)布。而且JAR文件采用zip壓縮算法,可以減少class文件在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)量,加快下載速度?!?width和height屬性:指定Applet程序在Web瀏覽器中顯示區(qū)域的寬度和高度,以像素為度量單位。
●?vspace和hspace屬性:用來設(shè)置以像素為單位的豎直和水平邊距。
●?align屬性:控制Applet的對(duì)齊方式,取值為left、right、top、texttop、middle、absmiddle、baseline、bottom、absbottom。
●?name屬性:為Applet指定一個(gè)具體的名字,該名字在與同一頁面的不同Applet通信時(shí)使用。
●?alt屬性:為不支持JavaApplet程序的Web瀏覽器顯示替代的文字,如果支持則該屬性被忽略。
APPLET標(biāo)記可以在<applet></applet>之間使用<param>標(biāo)記傳遞參數(shù)給Applet。例如:
<appletcode=“Java01.class”codebase=“javam”width=100height=60>
<paramname=“size”value=“5”>
<paramname=“font”value=“bold”>
</applet>
該APPLET標(biāo)記定義了兩個(gè)參數(shù),參數(shù)名分別為size與font,兩個(gè)參數(shù)的值分別為5和bold。Applet類提供了方法getParameter以獲取參數(shù)的值。getParameter方法的形式為
publicStringgetParameter(String
name)其中形式參數(shù)name用于指定傳遞給Applet的參數(shù)名。
下面是VisualJ++6.0生成的Applet程序框架中獲取參數(shù)的程序片段,請(qǐng)讀者注意其中的黑體字部分:
private finalStringlabelParam=“l(fā)abel”;
private finalStringbackgroundParam=“background”;
private finalStringforegroundParam=“foreground”;
//此處省略多行
StringlabelValue;
StringbackgroundValue;
StringforegroundValue;labelValue=getParameter(labelParam);
backgroundValue=getParameter(backgroundParam);
foregroundValue=getParameter(foregroundParam);
對(duì)應(yīng)的HTML文件中APPLET標(biāo)記如下:
<applet code=Applet1.classname=Applet1 width=320height=200>
<paramname=labelvalue="ThisstringwaspassedfromtheHTMLhost.">
<paramname=backgroundvalue="008080">
<paramname=foregroundvalue="FFFFFF">
</applet> 4.2圖形輸出
4.2.1案例2:鼠標(biāo)繪圖程序
案例1實(shí)現(xiàn)了圖像文件的顯示,但有時(shí)需要實(shí)時(shí)繪制圖形,而不是輸出預(yù)先準(zhǔn)備好的圖像。本節(jié)我們實(shí)現(xiàn)一個(gè)簡(jiǎn)單的鼠標(biāo)繪圖程序。圖4.3是該程序在JBuilder下運(yùn)行的畫面,按下鼠標(biāo)并拖動(dòng)時(shí)開始畫線,釋放鼠標(biāo)按鍵時(shí)停止,再次拖動(dòng)鼠標(biāo)時(shí)重新開始畫線。圖4.3鼠標(biāo)繪圖程序的運(yùn)行畫面4.2.2Java的圖形坐標(biāo)系統(tǒng)
為了將某一圖形在屏幕上繪制出來,首先要確定圖形的位置,為了解決這個(gè)問題就必須有一個(gè)精確的圖形坐標(biāo)系統(tǒng)來定位圖形。
與大多數(shù)其他計(jì)算機(jī)圖形系統(tǒng)所采用的二維坐標(biāo)系統(tǒng)一樣,Java語言的圖形系統(tǒng)的坐標(biāo)原點(diǎn)(0,0)在屏幕的左上角,水平向右為X軸的正方向,豎直向下為Y軸的正方向。每個(gè)坐標(biāo)點(diǎn)的值表示屏幕上的一個(gè)像素點(diǎn)的位置,因此,所有坐標(biāo)點(diǎn)的值都取整數(shù)。圖4.4表示用此圖形坐標(biāo)系統(tǒng)在屏幕上繪制一個(gè)矩形。圖4.4Java的圖形坐標(biāo)系統(tǒng)4.2.3案例2的實(shí)現(xiàn)
Graphics類提供了豐富的繪圖方法(method),利用Graphics類可以繪制各種圖形和文本。案例2要求隨著鼠標(biāo)移動(dòng)的軌跡繪制圖形,實(shí)際上只需要當(dāng)鼠標(biāo)拖動(dòng)時(shí)取出其坐標(biāo)位置,用直線連接起來就可以了。
Graphics類中提供畫線功能的是drawLine()方法,其調(diào)用格式如下:
drawLine(intx1,inty1,intx2,inty2)該方法需要設(shè)置四個(gè)參數(shù),其中x1,y1表示線段的一個(gè)坐標(biāo)點(diǎn),x2,y2表示線段的另一個(gè)坐標(biāo)點(diǎn)。Graphics類不專門提供畫點(diǎn)的方法,如果要畫點(diǎn)則用drawLine將兩點(diǎn)坐標(biāo)設(shè)為相同即可。
結(jié)合畫線的方法和前面關(guān)于鼠標(biāo)事件響應(yīng)的方法,案例2的功能實(shí)現(xiàn)代碼見程序4.6。【程序4.6】鼠標(biāo)畫線程序。
importjava.awt.*;
importjava.applet.*;
importjava.awt.event.*;
publicclassDrawLineextendsAppletimplementsMouseListener,
MouseMotionListener
{
PointstartPoint;
Pointpoints[]; intnumPoints=0;
booleandrawing=false;
publicvoidinit()
{
startPoint=newPoint(0,0);
points=newPoint[1000];
}
publicvoidstart()
{
addMouseMotionListener(this); //this作參數(shù) addMouseListener(this);
}
publicvoidpaint(Graphicsg)
{
for(inti=0;i<numPoints-1;i++){
g.drawLine(points[i].x,points[i].y,points[i+1].x,points[i+1].y);
}
}
publicvoidstop() {
removeMouseMotionListener(this);
removeMouseListener(this);
}
publicvoidmouseDragged(MouseEvente)
{
if(drawing&&numPoints<1000){
points[numPoints]=newPoint(e.getX(),e.getY());
numPoints++;
repaint(); }
}
publicvoidmouseMoved(MouseEvente){}
publicvoidmousePressed(MouseEvente)
{
drawing=true;
numPoints=0;
}
publicvoidmouseReleased(MouseEvente)
{
drawing=false; }
publicvoidmouseEntered(MouseEvente){}
publicvoidmouseExited(MouseEvente){}
publicvoidmouseClicked(MouseEvente){}
}
4.2.4其他常見圖形的繪制方法
除了直線,Graphics類還提供了直接繪制常見幾何圖形的方法。
1.繪制矩形
Graphics類提供了三種類型的矩形,分別為普通矩形、圓角矩形和立體矩形。每一種矩形都提供兩種不同風(fēng)格的方法:一種是僅畫出矩形的邊框;另一種是不僅畫出邊框,還用相同的顏色填充整個(gè)矩形區(qū)域。
繪制普通矩形調(diào)用drawRect或fillRect方法,格式如下:
drawRect(intx,inty,intwidth,intheight) //邊框型風(fēng)格
fillRect(intx,inty,intwidth,intheight) //填充型風(fēng)格其中前兩個(gè)參數(shù)表示矩形左上角的x坐標(biāo)和y坐標(biāo),后兩個(gè)參數(shù)分別表示矩形的寬度和高度。
圓角矩形的四個(gè)頂角呈圓弧狀,每個(gè)圓弧都是由1/4的橢圓弧所構(gòu)成的。畫圓角矩形的兩個(gè)方法的調(diào)用格式如下:
drawRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)
fillRoundRect(intx,inty,intwidth,intheight,intarcWidth,intarcHeight)
其中前四個(gè)參數(shù)與普通矩形含義相同,第五個(gè)參數(shù)arcWidth代表了圓角弧的橫向直徑,第六個(gè)參數(shù)arcHeight代表了圓角弧的縱向直徑。
Java中的立體矩形其實(shí)并非真正的三維圖形,只是在矩形的邊框上增加了一點(diǎn)陰影,使矩形看上去相對(duì)平面好像有凸出或凹下的效果。繪制方法為
draw3DRect(intx,inty,intwidth,intheight,booleanraised)
fill3DRect(intx,inty,intwidth,intheight,booleanraised)
這兩個(gè)方法中的前四個(gè)參數(shù)與drawRect方法中所用的參數(shù)含義是一樣的,第五個(gè)參數(shù)raised定義該立體矩形是具有凸出(值為true)還是凹下(值為false)的效果。
2.繪制多邊形
多邊形的繪制方法通常是給出一組坐標(biāo)點(diǎn),再用直線段將這些點(diǎn)依次連接起來。Graphics類中提供兩個(gè)方法來畫多邊形,一個(gè)是邊框型drawPolygon方法,另一個(gè)是填充型fillPolygon方法,每一種方法都有兩種不同的參數(shù)類型。
第一種參數(shù)類型的調(diào)用格式為
drawPolygon(intxPoints[],intyPoints[],intnPoints)
fillPolygon(intxPoints[],intyPoints[],intnPoints)
其中xPoints參數(shù)是一個(gè)整數(shù)數(shù)組,用以存放多邊形坐標(biāo)點(diǎn)的X坐標(biāo)值;yPoints參數(shù)存放相應(yīng)的一組Y坐標(biāo)值;nPoints則表示共有幾個(gè)坐標(biāo)點(diǎn)。例如,下面的paint方法分別畫了一個(gè)邊框型和一個(gè)填充型的多邊形。publicvoidpaint(Graphicsg){
intPoly1_x[]={30,63,115,72,67};
intPoly1_y[]={40,20,95,74,106};
intPoly1_pts=Poly1_x.length;
intPoly2_x[]={180,213,265,222,217};
intPoly2_y[]={40,20,95,74,106};
intPoly2_pts=Poly2_x.length;
g.drawPolygon(Poly1_x,Poly1_y,Poly1_pts);
g.fillPolygon(Poly2_x,Poly2_y,Poly2_pts);
}第二種參數(shù)類型的調(diào)用格式為
drawPolygon(Polygonp)
fillPolygon(Polygonp)
其中Polygon是定義在java.awt中的一個(gè)類,它的構(gòu)造方法有兩種不同的參數(shù)傳遞形式。一種與drawPolygon()方法的第一種調(diào)用格式一樣:
Polygon(intxPoints[],intyPoints[],intnPoints)
另一種調(diào)用格式則是使用無參數(shù)構(gòu)造方法創(chuàng)建一個(gè)空的多邊形,再用addPoint()方法將多邊形的坐標(biāo)點(diǎn)動(dòng)態(tài)地增加到Polygon對(duì)象中。
3.繪制橢圓和圓
繪制橢圓的方法是給出該橢圓的外接矩形作為參數(shù),其調(diào)用格式與畫普通矩形的方法相似:
drawOval(intx,inty,intwidth,intheight) //邊框型風(fēng)格
fillOval(intx,inty,intwidth,intheight) //填充型風(fēng)格
特別要注意x和y不是橢圓的圓心坐標(biāo),而是該橢圓外接矩形的左上角。因此,畫橢圓時(shí),把它先看做是一個(gè)矩形將有助于在坐標(biāo)系統(tǒng)中定位。
Graphics類不專門提供畫圓的方法,只要在繪制橢圓時(shí)將width與height參數(shù)置成相等就可以了。下面的paint方法繪制了一個(gè)圓和一個(gè)用顏色填充的橢圓。
publicvoidpaint(Graphicsg){
g.drawOval(30,20,60,60);
g.fillOval(130,20,80,60);
}
4.畫弧
弧是橢圓的一部分,畫弧的方法就相當(dāng)于先畫一個(gè)橢圓,而后取該橢圓中所需要的一部分。它們的調(diào)用格式如下: drawArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle) //邊框型風(fēng)格
fillArc(intx,inty,intwidth,intheight,intstartAngle,intarcAngle) //填充型風(fēng)格
其中前四個(gè)參數(shù)的含義與畫橢圓一樣;后兩個(gè)參數(shù)即用來定義橢圓的一部分,startAngle參數(shù)表示該弧從什么角度開始,arcAngle參數(shù)表示從startAngle開始轉(zhuǎn)了多少度。水平向右表示0°,逆時(shí)針方向?yàn)檎嵌戎担槙r(shí)針方向?yàn)樨?fù)角度值。如果startAngle和arcAngle中有任一值大于360°,都會(huì)被轉(zhuǎn)換為0~360°之間的數(shù)值。另外,fillArc()方法的效果并不是填充弧的兩個(gè)端點(diǎn)直接連線所圍的區(qū)域,而是填充弧的兩端點(diǎn)與圓心連線所圍的扇形區(qū)域,像一個(gè)餅圖。
5.復(fù)制與清除圖形
當(dāng)需要重復(fù)繪制一些相同的圖形時(shí),也可采用Graphics類中的copyArea方法,它能將屏幕上某一矩形區(qū)域里的內(nèi)容復(fù)制到屏幕的另一區(qū)域。其調(diào)用格式如下:
copyArea(intx,inty,intwidth,intheight,intdx,intdy)其中前四個(gè)參數(shù)定義了要被復(fù)制的屏幕的矩形區(qū)域;最后兩個(gè)參數(shù)則表示新區(qū)域與原始屏幕區(qū)域的偏移距離:若dx,dy為正值,則表示新區(qū)域相對(duì)于原區(qū)域的右方及下方所偏移的像素值,反之則分別表示相對(duì)左方及上方的偏移量。
若要清除屏幕的某一矩形區(qū)域所畫的內(nèi)容,可用clearRect方法,它用當(dāng)前的背景顏色來填充整個(gè)矩形區(qū)域。其調(diào)用格式為
clearRect(intx,inty,intwidth,intheight)其中四個(gè)參數(shù)定義了所要清除的矩形區(qū)域。例如,想要清除整個(gè)Applet區(qū)域,可先調(diào)用Applet類的size()方法得到整個(gè)Applet的寬度和高度(該方法沒有參數(shù),返回值是一個(gè)Dimension對(duì)象),再調(diào)用clearRect()方法就可以了。例如:
g.clearRect(0,0,size().width,size().height);
4.2.5文本的輸出
程序1.2調(diào)用Graphics類的drawString方法在屏幕上顯示一個(gè)字符串,沒有指定字體和顏色,drawString使用缺省的字體和顏色輸出,輸出結(jié)果顯得很一般。如果希望輸出的文本顯示更具特色,可以指定某種字體、某種風(fēng)格、尺寸大小和色彩。
1.字體的設(shè)置
如果程序需要在屏幕上輸出文本信息,首先要確定采用何種字體,例如中文的“宋體”、“楷體”,或英文的“TimesRoman”體、“Courier”體等;接著再?zèng)Q定該字體輸出時(shí)采用哪種風(fēng)格,是斜體還是粗體等;最后還要確定該字體的大小尺寸。所有這些都由Font類來定義,其構(gòu)造方法的形式為
publicFont(Stringname,intstyle,intsize)
它的三個(gè)參數(shù)分別代表字體名、字體風(fēng)格和尺寸大小。
name指定文本輸出的字體,如果運(yùn)行該Applet的客戶端系統(tǒng)未安裝該字體,Java會(huì)以缺省字體來替代它。客戶端系統(tǒng)支持的字體可以用java.awt.Toolkit類中的getFontlist()方法來獲得,它返回系統(tǒng)目前可用的字體列表,然后就可決定到底選用哪種字體。例如:
Toolkitsystk=Toolkit.getDefaultToolkit();
String[]fonts=systk.getFontList();
Font類中已定義了靜態(tài)常量來表示字體的style值,如Font.BOLD(粗體)、Font.ITALIC(斜體)、Font.PLAIN(普通體),可以進(jìn)行相加運(yùn)算來生成復(fù)合style。例如,想讓style既是粗體又是斜體,可以這樣寫:
Fontfn=newFont(“TimesRoman”,Font.BOLD+Font.ITALIC,28);
創(chuàng)建了Font對(duì)象以后,用Graphics類的setFont()方法即可將所創(chuàng)建的Font對(duì)象設(shè)為當(dāng)前所用的字體。setFont的形式為
publicvoidsetFont(Font
font)
設(shè)置字體后可以利用Graphics類中提供的drawString()、drawChars()等方法來輸出字符串與字符,形式如下:
publicvoiddrawString(String
str,int
x,int
y)
publicvoiddrawChars(char[]
data,int
offset,int
length,int
x,int
y)
drawString方法中的參數(shù)str為要顯示的字符串;x,y指明字符串顯示的起始位置坐標(biāo),其中x表示第一個(gè)字符的左邊界,y表示整個(gè)字符串的基線(baseline,見圖4.5)位置。
drawChars方法則是用來顯示多個(gè)字符的,從給定的字符數(shù)組中抽取連續(xù)的一部分顯示在屏幕上。其中data參數(shù)就是給定的字符數(shù)組,offset表示從第幾個(gè)字符位置開始,length表示共顯示幾個(gè)字符,x與y參數(shù)的含義與drawString方法一樣。圖4.5字符串輸出的坐標(biāo)示意圖程序4.7顯示了一些不同的文本字體,其顯示結(jié)果如圖4.6所示。
【程序4.7】用指定的字體輸出文本。
importjava.awt.Graphics;
importjava.awt.Font;
publicclassFontDemoextendsjava.applet.Applet{
publicvoidpaint(Graphicsg){
Fontftp20=newFont("TimesRoman",Font.PLAIN,20);
Fontfai15=newFont("Arial",Font.ITALIC,15);
Fontfcb24=newFont("Courier",Font.BOLD,24); Fontfsib30=newFont("宋體",Font.ITALIC+Font.BOLD,30);
g.setFont(ftp20);
g.drawString("FontnameTimesRoman,styleplain,size20",10,20);
g.setFont(fai15);
g.drawString("FontnameArial,styleitalic,size15",10,50);
g.setFont(fcb24);
g.drawString("FontnameCourier,stylebold,size24",10,80); g.setFont(fsib30);
g.drawString(“字體名宋體,風(fēng)格斜體+粗體,尺寸30”,10,120);
}
}
系統(tǒng)當(dāng)前所用的字體信息可以用Graphics類中的getFont()方法獲得,該方法無參數(shù),它返回系統(tǒng)當(dāng)前所用的Font對(duì)象,然后就可以調(diào)用Font類中提供的幾個(gè)方法來獲取該字體的基本信息。表4.1列出了Font類中的這些方法,表中只給出了方法名。圖4.6程序4.7的輸出結(jié)果表4.1Font類提供的一些主要方法
2.顏色的設(shè)置
與設(shè)置字體信息相似,要設(shè)置新的顏色,必須先創(chuàng)建Color對(duì)象,然后再調(diào)用Graphics類中設(shè)置顏色的方法來將該Color對(duì)象設(shè)為當(dāng)前所用的繪圖顏色。
Java中每一種顏色都看成是由紅(R)、綠(G)、藍(lán)(B)三原色組合而成的,因此Color類的構(gòu)造方法形式如下:
Color(intr,intg,intb)其中每個(gè)參數(shù)的值都在0~255之間,數(shù)值越大就表明這種顏色的成分越重。例如(0,0,0)代表黑色,(255,0,0)代表紅色。若客戶端系統(tǒng)不支持當(dāng)前所定義的顏色值,Java會(huì)挑選最接近的顏色來代替。
Color類中定義了一些標(biāo)準(zhǔn)顏色的Color對(duì)象,使得這些標(biāo)準(zhǔn)顏色的引用顯得更為方便。這些類變量如表4.2所示。表4.2標(biāo)準(zhǔn)的Color對(duì)象創(chuàng)建Color對(duì)象后,還需調(diào)用Graphics類中的setColor方法把這個(gè)對(duì)象設(shè)置為系統(tǒng)當(dāng)前所用的繪畫顏色,調(diào)用格式為
setColor(Colorc)
例如,想要用藍(lán)色來顯示文本,最簡(jiǎn)單的辦法是直接引用標(biāo)準(zhǔn)色的類變量:
setColor(Color.blue);
另外,Java還提供了設(shè)置整個(gè)Applet的背景和前景的方法,它們分別是setBackground和setForeground方法。它們都被定義在java.awt.Component類中,因此該方法能被其子類(包括Applet類及Applet類的子類)繼承,它們的調(diào)用格式與setColor()方法一樣:
setBackground(Colorc)
setForeground(Colorc)
其中,setForeground()方法將影響到Applet中所有已經(jīng)用其他任何顏色所繪制的圖形及顯示的文本,可把它們?nèi)甲優(yōu)樵摲椒ㄋx的前景色,而無需重新一一繪制。
與字體類似,Java也提供了getColor方法(Graphics類中)、getBackground方法和getForeground方法(Component類中)來分別獲取當(dāng)前的繪圖顏色、Applet背景及前景顏色的對(duì)象。
程序4.8顯示了若干行用隨機(jī)定義的顏色輸出的文本。【程序4.8】用指定的顏色輸出文本。
importjava.awt.Graphics;
importjava.awt.Color;
publicclassColorDemoextendsjava.applet.Applet{
publicvoidpaint(Graphicsg){
intred,green,blue;
for(inti=10;i<200;i+=15){
red=(int)Math.floor(Math.random()*256);
green=(int)Math.floor(Math.random()*256);
blue=(int)Math.floor(Math.random()*256);
g.setColor(newColor(red,green,blue));
g.drawString("Color",1,i);
}
}
}
4.3圖形用戶界面設(shè)計(jì)
4.3.1案例3:圖形界面的簡(jiǎn)易計(jì)算器
案例1和案例2實(shí)現(xiàn)了圖像的輸出和圖形的繪制,但通常我們?cè)赪indows操作系統(tǒng)下看到的很多應(yīng)用程序窗口,它們是由一些固定的界面元素如按鈕、編輯框、標(biāo)簽等構(gòu)成的,利用案例1和案例2的方法來繪制圖形界面的這些元素不但費(fèi)時(shí)而且也沒有必要。Java.awt包中已經(jīng)提供了這些界面元素的實(shí)現(xiàn),將它們的實(shí)現(xiàn)封裝為一些類,程序員可以很容易利用這些類來構(gòu)造復(fù)雜的用戶界面。本節(jié)案例要求實(shí)現(xiàn)一個(gè)圖形界面的簡(jiǎn)易計(jì)算器,其運(yùn)行界面如圖4.7所示。該計(jì)算器能夠進(jìn)行加減乘除運(yùn)算,點(diǎn)擊“CLEAR”按鈕計(jì)算器值清零。圖4.7簡(jiǎn)易計(jì)算器4.3.2容器與組件
Java類庫中與圖形界面有關(guān)的基本類都放在java.awt包中。AWT是Java語言提供的用戶界面設(shè)計(jì)工具,它是抽象窗口工具包(AbstractWindowingToolkit)的英文縮寫。由于Java是一個(gè)跨平臺(tái)的編程語言,AWT并不試圖實(shí)現(xiàn)任何特定的圖形界面操作系統(tǒng)的所有特征,它僅僅實(shí)現(xiàn)所有操作系統(tǒng)的普通特征,以保證其跨平臺(tái)的特性。
AWT中將構(gòu)成用戶界面的各種元素如按鈕、標(biāo)簽等稱為組件,組件的共同特征由Component類實(shí)現(xiàn),其他大多數(shù)組件都是由Component類派生而來的。正如我們?cè)赪indows環(huán)境下看到的,按鈕一類的界面元素并不是獨(dú)立存在的,它們都是放置在某個(gè)窗口、面板等上的。AWT將這些窗口和面板稱為容器,容器類也是從Component類派生而來的,它們是一類特別的組件,可以在容器上放置其他組件。對(duì)于案例3來說,Applet就是一個(gè)容器,可以在上面放置按鈕、標(biāo)簽等組件。按鈕、標(biāo)簽這一類的組件是一般的組件,不能像容器那樣放置其他組件。
容器用來組織其他界面元素,一個(gè)應(yīng)用程序的圖形界面首先對(duì)應(yīng)于一個(gè)復(fù)雜的容器,如一個(gè)窗口。這個(gè)容器內(nèi)部將包含許多界面元素,這些界面元素本身又可以是一個(gè)容器,這個(gè)容器將再進(jìn)一步包含其他的界面元素,構(gòu)成一個(gè)復(fù)雜的圖形界面系統(tǒng)。常見的容器組件有Applet、Panel、Window、Frame、Dialog等。容器組件提供了方法add用來將組件對(duì)象加入到容器中。例如將下面的代碼放入Applet的init方法,則建立一個(gè)按鈕并加入到Applet中。
Buttonbutton1=newButton(“Hello”); //創(chuàng)建組件對(duì)象
add(Button1); //將組件加入容器
這里Button為命令按鈕組件的類名,以按鈕上的提示文字作為構(gòu)造方法的參數(shù)。命令按鈕是圖形界面中非常重要的一種基本組件,當(dāng)用戶點(diǎn)擊按鈕時(shí),系統(tǒng)自動(dòng)執(zhí)行與該按鈕相聯(lián)系的程序,從而完成預(yù)先指定的功能。
Button類有兩種構(gòu)造方法:
●?publicButton();——構(gòu)造一個(gè)沒有提示文字的按鈕;
●?publicButton(Strings);——構(gòu)造一個(gè)以給定字符串為提示文字的按鈕。
例如,下面的語句定義一個(gè)“OK”按鈕:
Buttonb=newButton(“OK”);
Button組件提供了一些方法獲取和設(shè)置某些屬性。例如,獲得按鈕上的提示文字可以使用:
publicStringgetLabel();改變按鈕上的提示文字可以使用:
publicvoidsetLabel(Strings);
案例3界面上需要的另一個(gè)組件是標(biāo)簽,標(biāo)簽是最簡(jiǎn)單的組件,其實(shí)質(zhì)就是一段文字。Label類中定義了三種構(gòu)造方法:
●?publicLabel();——構(gòu)造一個(gè)空的標(biāo)簽,不顯示任何內(nèi)容;
●?publicLabel(Stringtext);——構(gòu)造建立一個(gè)以String為內(nèi)容的標(biāo)簽;
●?publicLabel(Stringtext,intalignment);——定義一個(gè)標(biāo)簽。參數(shù)alignment代表一個(gè)給定的對(duì)齊方式,可以是靠左、靠右和居中,缺省設(shè)置是靠左。Label類中定義了相應(yīng)的常量Label.LEFT、Label.RIGHT和Label.CENTER來表示這三種對(duì)齊方式。下面的語句定義一個(gè)居中的Name標(biāo)簽:
Labell1=newLabel(“Name”,Label.CENTER);
Label類還定義了一些方法來獲取或修改標(biāo)簽對(duì)象的設(shè)置:
●?publicStringgetText();——獲得標(biāo)簽上的文字;
●?publicvoidsetText(Stringtext);——修改標(biāo)簽上的文字;
●?publicintgetAlignment();——獲得標(biāo)簽的對(duì)齊方式;
●?publicvoidsetAlignment(intalignment);——設(shè)置標(biāo)簽的對(duì)齊方式。
現(xiàn)在可以將案例3界面所要求的按鈕和標(biāo)簽加到Applet上,程序4.9給出了源代碼。【程序4.9】案例3界面的初步構(gòu)造。
importjava.awt.*;
publicclassAppletCalextendsjava.applet.Applet{
Labeltitle=newLabel("簡(jiǎn)易計(jì)算器",Label.CENTER);
LabelDisplayStr=newLabel("0",Label.RIGHT);
Buttonbuttons[]=newButton[17];
StringbuttonStr[]=
{"7","8","9","+","4","5","6","-","1","2","3","*","0",".","=","/","CLEAR"};publicvoidinit()
{
add(title); //第一行為標(biāo)題
add(DisplayStr); //第二行為計(jì)算器顯示區(qū)
intj=0;
for(inti=0;i<16;i++){ //前16個(gè)按鈕,每行4個(gè)
buttons[i]=newButton(buttonStr[i]);
add(buttons[i]);
}
//最后一行為“CLEAR”、“關(guān)于”按鈕
buttons[16]=newButton(buttonStr[16]);
add(buttons[16]);
}
}
4.3.3組件的布局
運(yùn)行程序4.9可以發(fā)現(xiàn),雖然標(biāo)簽和按鈕組件都已加入到Applet上去了,但界面并不符合要求,所有的組件對(duì)象都擠在上面兩行,如圖4.9所示。圖4.8程序4.9運(yùn)行界面再觀察一下程序4.8的代碼,可以發(fā)現(xiàn),組件是按順序加入Applet的,但是并沒有指定這些組件如何在Applet上布局,放置在什么位置。圖4.8中的位置是怎么決定的呢?實(shí)際上這是由Applet的默認(rèn)布局管理器布置的。
布局管理器用于控制組件在容器中的位置。由于Java的跨平臺(tái)特性,使用AWT編制圖形界面的程序一般不采用絕對(duì)位置定位組件。如果采用絕對(duì)位置定位組件,可能會(huì)使圖形界面在不同平臺(tái)下差異較大,例如一個(gè)相同的按鈕組件在Windows平臺(tái)中的高度為25像素,但在Motif平臺(tái)上顯示時(shí)卻是28像素,這樣在Windows平臺(tái)上運(yùn)行良好的用戶界面在Motif平臺(tái)上可能會(huì)相互擠成一團(tuán)。布局管理器只允許聲明組件間的相對(duì)位置和前后關(guān)系,無需指定組件的大小,這樣布局管理器就可以自動(dòng)調(diào)整組件顯示,從而達(dá)到界面的平臺(tái)無關(guān)性。
AWT提供五種布局管理器供選擇:FlowLayout、GridLayout、GridBagLayout、BorderLayout和CardLayout。用戶可以使用類似下面的語句來選擇布局管理器:
publicvoidinit(){
setLayout(newFlowLayout());
}
下面逐一介紹這五種布局管理器。
1.FlowLayout
FlowLayout是最簡(jiǎn)單的布局管理器,也是AWT采用的缺省布局方式。它的布局原則是將組件從左向右、從上向下排列,如果這行放不下這個(gè)組件,就放入下一行。
FlowLayout可設(shè)置布局的對(duì)齊方式為居中、靠左或靠右,缺省對(duì)齊方式為居中??梢栽趧?chuàng)建FlowLayout對(duì)象時(shí)使用該類中定義的常量CENTER、LEFT和RIGHT指定對(duì)齊方式。例如:
setLayout(newFlowLayout(FlowLayout.LEFT);
另外,F(xiàn)lowLayout還可以設(shè)置組件間橫向和縱向的間隔,缺省是5個(gè)像素。下面的語句將橫向間隔設(shè)置為5個(gè)像素,縱向間隔設(shè)置為10個(gè)像素。
setLayout(newFlowLayout(FlowLayout.CENTER,5,10);
2.GridLayout
GridLayout布局管理器將容器劃分成網(wǎng)格狀,每一個(gè)組件按照添加的順序從左向右、從上向下地占據(jù)一個(gè)單元。在GridLayout中,組件添加的順序相當(dāng)重要。程序4.10采用2×3的網(wǎng)格布局,圖4.9是執(zhí)行的結(jié)果。圖4.9GridLayout布局演示【程序4.10】GridLayout布局管理器。
importjava.awt.*;
importjava.applet.*;
publicclassApplet1extendsApplet
{
publicvoidinit()
{
setLayout(newGridLayout(2,3,20,35));
add(newButton("Button1"));
add(newButton(“Button2”));
add(newButton(“Button3”));
add(newButton(“Button4”));
add(newButton(“Button5”));
add(newButton(“Button6”));
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年物流與供應(yīng)鏈管理優(yōu)化合同
- 2024年滬教版七年級(jí)物理下冊(cè)月考試卷
- 2024年浙教版高二數(shù)學(xué)上冊(cè)階段測(cè)試試卷
- 2024年離異后子女撫養(yǎng)費(fèi)用協(xié)議
- 醫(yī)療安全知識(shí)在英語繪本教學(xué)中的滲透
- 2025中國鐵路北京局集團(tuán)招聘全日制普通高校畢業(yè)生140人(二)高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國郵政集團(tuán)江蘇分公司春季招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國系統(tǒng)校園招聘360人(寒假專場(chǎng))高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中國原子能科學(xué)研究院回旋加速器研究設(shè)計(jì)中心校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025中共江蘇省委黨校(江蘇行政學(xué)院)公開招聘專業(yè)技術(shù)人員10人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 鋼筋工程專項(xiàng)施工方案
- 光電子技術(shù)(第二版)全套課件電子教案板
- 統(tǒng)編版(2024新版)七年級(jí)上冊(cè)歷史期末復(fù)習(xí)全冊(cè)知識(shí)點(diǎn)考點(diǎn)提綱
- 高中英語單詞默寫卡片新人教版必修二Unit1
- Tobii-Studio-眼動(dòng)儀中文使用手冊(cè)
- 公司場(chǎng)地授權(quán)使用合同協(xié)議書
- 龍湖云河玉陛暖通系統(tǒng)報(bào)價(jià)(氟機(jī))-20231107
- 相關(guān)分析spss課件
- 兒童版畫(版畫基礎(chǔ))
- 現(xiàn)代奶牛飼養(yǎng)技術(shù)考試考核試卷
- 車輛提檔委托書樣本
評(píng)論
0/150
提交評(píng)論