手持移動設(shè)備JME應(yīng)用開發(fā)_第1頁
手持移動設(shè)備JME應(yīng)用開發(fā)_第2頁
手持移動設(shè)備JME應(yīng)用開發(fā)_第3頁
手持移動設(shè)備JME應(yīng)用開發(fā)_第4頁
手持移動設(shè)備JME應(yīng)用開發(fā)_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

手持移動設(shè)備J2ME應(yīng)用開發(fā)4MIDP高級界面開發(fā)第章本章目標(biāo)了解Screen的基本概念了解基本屏幕類的開發(fā)掌握控件的開發(fā)技術(shù)掌握控件事件的開發(fā)過程掌握對話框的編寫技巧掌握自繪畫控件的開發(fā)技術(shù)4.1MIDP高級界面軟件在進(jìn)行每一步操作時所顯示的電腦版面稱為界面。一個好的界面必備條件是:內(nèi)容清楚、指示明白、屏幕美觀和有親切感。界面通常包含有圖形和文字。程序界面的設(shè)計是對適當(dāng)?shù)目丶M(jìn)行取舍及功能的選擇和處理的過程。在程序設(shè)計中,需要對設(shè)計的方法反復(fù)推敲、琢磨,才能使其達(dá)到完美的境界。但是MIDP的界面設(shè)計開發(fā)不同于一般的桌面程序,它受限于屏幕的大小、顏色、內(nèi)存和處理能力,不可能做到像桌面程序那樣花哨。所以一個好的界面也應(yīng)該根據(jù)設(shè)備具體情況進(jìn)行有針對性的設(shè)計,由于使用J2ME提供的基礎(chǔ)控件,所以叫做高級界面。MIDP高級界面開發(fā)簡介

MIDP中定義的界面從邏輯上包括兩組API:高級API和低級API。高級API提供了常用的應(yīng)用控件,它主要強(qiáng)調(diào)可移植性,但是高級API對于控件的顯示外觀只有有限的控制權(quán),而且事件的使用也很有限,但它的優(yōu)點就是提供了程序的高復(fù)用控件以及增加了系統(tǒng)的整體協(xié)調(diào)性和一致性。MIDP程序界面是通過屏幕顯示出來的。由于手機(jī)或其他無線設(shè)備,一般都具有一個顯示屏幕,在屏幕上顯示一幅畫面就是一個Display對象所要實現(xiàn)的功能。每個MIDP程序都由Displayable對象來具體處理如何在屏幕上顯示內(nèi)容。MIDP程序可以根據(jù)手機(jī)使用者與程序的交互情況,把每次操作后的畫面通過Displayable對象顯示在當(dāng)前屏幕上。Displayable是Display的一個繼承類,它主要包括兩個具體的實現(xiàn)類:高級界面開發(fā)類Screen和低級界面開發(fā)類Canvas。4.1.1Display類的常用函數(shù)Displayable中MIDP1.0就定義的函數(shù)有:booleanisShown()voidaddCommand(Commandcmd)voidremoveCommand(Commandcmd)voidsetCommandListener(CommandListenerl)Displayable中MIDP2.0新添加的函數(shù)有:StringgetTitle()publicvoidsetTitle(Strings)TickergetTicker()publicvoidsetTicker(Tickerticker)publicintgetWidth()publicintgetHeight()protectedvoidsizeChanged(intw,inth)Display類的開發(fā)以上函數(shù)都可以在Screen類和Canvas類中使用。但是進(jìn)行MIDP開發(fā)的時候,一定要分清楚程序的開發(fā)環(huán)境,如果是在MIDP1.0的開發(fā)平臺下開發(fā),則MIDP2.0新添加的函數(shù)是不能夠使用的。在MIDP2.0中,高級界面開發(fā)類的繼承關(guān)系如圖所示。高級界面開發(fā)類Screen類共有4個繼承它的屏幕類,而Form屏幕類又共有8個繼承Item類的控件類,其中在MIDP2.0開發(fā)平臺中,F(xiàn)orm類新增加了Customltem類和Spacer類。4.1.2Display類的開發(fā)

4.2事件處理事件就是用戶與GUI(圖形界面)交互的時候所觸發(fā)的事情。在J2ME中,事件會被傳送至事件處理器,它是一個專門接受事件對象并進(jìn)行翻譯、處理的方法,這個事件處理器一般由J2ME中的監(jiān)聽器來實現(xiàn)。監(jiān)聽器是能夠檢測事件并且能夠響應(yīng)事件的代碼。當(dāng)一個用戶與一個手機(jī)MIDlet程序交互的時候,事件就會產(chǎn)生,這個手機(jī)MIDlet程序就會響應(yīng)這些事件。而監(jiān)聽器就是通過程序設(shè)計人員定義的特定函數(shù)來處理的。需要注意的是每個事件的處理總是在前一個事件處理完成以后程序才會接著處理,這意味著事件不能夠同時被處理,它們是串行處理的。在MIDP開發(fā)中,有以下幾種處理事件的用戶接口:(1)高級別MIDP的API中抽象命令接口(2)單個鍵的按下與放開的低級別事件接口(3)Canvas類中的paint()函數(shù)調(diào)用(4)Display類中的Runnable對象的run()函數(shù),當(dāng)callSerially()函數(shù)被調(diào)用的時候,run()函數(shù)被觸發(fā)

4.2.2按鈕、菜單編程基礎(chǔ)在介紹事件開發(fā)之前首先了解基本的Command(命令)編程。Midlet的javax.Microedition.lcdui包提供了一個命令Command類,用來進(jìn)行屏幕上按鈕的相關(guān)開發(fā),Command對象既可以顯示為一個與鍵盤特定鍵相關(guān)聯(lián)的按鈕,又可以作為屏幕菜單的一個菜單項。由于手機(jī)程序功能有限,因此并沒有提供像Windwos程序一樣的菜單控件,而是當(dāng)屏幕需要顯示多個按鈕的時候,自動生成一個菜單供用戶選擇使用。創(chuàng)建一個新的Command對象需要調(diào)用Command對象的構(gòu)造函數(shù),構(gòu)造函數(shù)的的語法如下所示:

newCommand(Labels,Type,Priority);按鈕、菜單編程基礎(chǔ)在介紹事件開發(fā)之前首先了解基本的Command(命令)編程。Midlet的javax.Microedition.lcdui包提供了一個命令Command類,用來進(jìn)行屏幕上按鈕的相關(guān)開發(fā),Command對象既可以顯示為一個與鍵盤特定鍵相關(guān)聯(lián)的按鈕,又可以作為屏幕菜單的一個菜單項。由于手機(jī)程序功能有限,因此并沒有提供像Windwos程序一樣的菜單控件,而是當(dāng)屏幕需要顯示多個按鈕的時候,自動生成一個菜單供用戶選擇使用。創(chuàng)建一個新的Command對象需要調(diào)用Command對象的構(gòu)造函數(shù),構(gòu)造函數(shù)的的語法如下所示:

newCommand(Labels,Type,Priority);命令類型的重要指數(shù)

創(chuàng)建一個Command對象的時候,需要指定構(gòu)造函數(shù)的3個參數(shù),例如創(chuàng)建一個按鈕標(biāo)簽名稱為“Exit”的命令對象,指定了它的類型是“EXIT”類型,具體代碼如下所示://定義了一個Command控件變量

privateCommandexitCommand;//創(chuàng)建一個新的Command對象

exitCommand1=newCommand(“Exit”,Command.EXIT,1);添加按鈕的方法在程序的構(gòu)造函數(shù)HelloWorld()中新添加一個“Command.BACK”屬性的按鈕,更改部分的代碼如下所示。1privateCommandexitCommand,backCommand2privateTextBoxtb;3publicHelloWorld(){//創(chuàng)建2個Command對象4exitCommand=newCommand(“Exit”,Command.EXIT,1);5backCommand=newCommand(“Back”,Command.BACK,1);6tb=newTextBox(“HelloMIDlet”,“Hello,World!”,15,0);7tb.addCommand(exitCommand);8tb.addCommand(backCommand);9tb.setCommandListener(this);10}其中第1行代碼添加了一個新的Command對象backCommand,第8行代碼使用addCommand()函數(shù)把backCommand對象添加到TextBox屏幕對象中

添加按鈕的方法運(yùn)行效果添加按鈕的方法如果在原來的基礎(chǔ)上再添加幾個按鈕,看看會出現(xiàn)什么樣的效果?在“HelloWorld”程序中多添加2個Command對象的具體代碼如下所示:1privateCommandexitCommand,backCommand,screenCommand1,screenCommand2;2privateTextBoxtb;3publicHelloWorld(){//創(chuàng)建2個Command對象4exitCommand=newCommand(“Exit”,Command.EXIT,1);5backCommand=newCommand(“Back”,Command.BACK,1);6screenCommand1=newCommand(“Screen1”,Command.SCREEN,1);7screenCommand2=newCommand(“Screen2”,Command.SCREEN,1);8tb=newTextBox(“HelloMIDlet”,“Hello,World!”,15,0);9tb.addCommand(backCommand);10tb.addCommand(exitCommand);11tb.addCommand(screenCommand1);12tb.addCommand(screenCommand2);13tb.setCommandListener(this);14}添加按鈕的方法由于添加的2個按鈕是Screen屬性的按鈕,而且手機(jī)使用習(xí)慣是在屏幕左右各只有一個按鈕,所以添加多個按鈕以后,程序?qū)詣语@示一個Menu菜單按鈕,在模擬器上單擊Menu菜單,可以看到顯示如圖所示的3個菜單項,而“Exit按鈕本來在程序代碼中是最先添加的,現(xiàn)在被自動調(diào)整為第3項,也就是菜單中的最后一項。這些都是根據(jù)按鈕的類型來自動調(diào)整的。由此可見,如果需要顯示菜單效果,只需要多添加幾個按鈕即可。

處理高級別事件

所謂的高級別事件,就是指在處理高級界面上的控件時候需要處理的事件。每一個高級界面的Dislayable對象都有一個相應(yīng)監(jiān)聽器,該監(jiān)聽器用來監(jiān)聽控件是否已經(jīng)被觸發(fā)了相關(guān)的事件。本小節(jié)僅僅介紹Command對象的事件開發(fā),其他控件的事件開發(fā)將結(jié)合相關(guān)小節(jié)的具體內(nèi)容再進(jìn)行詳細(xì)介紹。要處理按鈕高級別事件,程序必須繼承一個命令監(jiān)聽器接口類CommandListener類,具體操作如下所示:publicclassHelloWorldextendsMIDletimplementsCommandListener{}

4.2.3處理高級別事件在一個MIDlet程序的開發(fā)中,如果繼承了監(jiān)聽器接口類CommandListener類,所有的按鈕事件都會觸發(fā)事件,然后執(zhí)行publicvoidcommandAction()函數(shù)的,通過這個函數(shù)可以處理幾乎所有程序中的事件,當(dāng)屏幕按鈕被按下,就立刻執(zhí)行commandAction()函數(shù)中相應(yīng)的一系列的代碼。實現(xiàn)觸發(fā)了exitCommand命令對象以后,立刻關(guān)閉MIDlet程序的具體代碼如下所示:1publicvoidcommandAction(Commandc,Displayabled){2if(c==exitCommand){3try{//關(guān)閉程序4destroyApp(false);5 }catch(MIDletStateChangeExceptionexception){6System.out.println(“MIDletStateChangeException”);7}8notifyDestroyed();9}10}處理高級別事件第1行代碼指明了2個函數(shù)參數(shù),其中參數(shù)Command表示當(dāng)前被觸發(fā)的按鈕對象,參數(shù)d表示當(dāng)前顯示的屏幕對象。第2行代碼判斷到屏幕上觸發(fā)的Command對象是exitCommand對象,則調(diào)用destroyApp(false)函數(shù)申請關(guān)閉程序,在關(guān)閉的過程中需要釋放所有資源并保存持久性數(shù)據(jù),然后使用notifyDestroyed()函數(shù)通知系統(tǒng)立刻關(guān)閉該程序,讓系統(tǒng)認(rèn)為所有資源已經(jīng)被回收了,然后可以安全地關(guān)閉程序了。

4.2.4處理低級別事件

低級別事件是指處理低級界面開發(fā)Canvas類的時候需要自己定義的按鍵作用所觸發(fā)的相關(guān)事件。當(dāng)一個鍵按下的時候,系統(tǒng)會返回相關(guān)的鍵代碼,需要自己做這部分的代碼進(jìn)行事件處理,在低級界面設(shè)計一章將會詳細(xì)介紹如何處理低級別事件。

4.3基本屏幕控件屏幕控件就是負(fù)責(zé)屏幕顯示的控件,目前主要有4種,它們的API處理過程都是繼承Screen類的,它們的名稱和具體功能如下所示:List:從指定的幾個列表種選取需要的選項TextBox:用來輸入文本Alert:用來顯示通知用戶的一些文本和圖像信息Form:用來顯示多個不同類型的控件,使它們顯示在同一屏幕上4.3.1TextBoxTextBox是可以允許用戶編輯文本的屏幕對象。創(chuàng)建一個TextBox屏幕對象必須使用TextBox的構(gòu)造函數(shù),TextBox的構(gòu)造函數(shù)如下所示:TextBox(Stringtitle,Stringtext,intmaxSize,intconstraints);

其中參數(shù)title指定了TextBox的標(biāo)題,參數(shù)text指定了TextBox的初始化內(nèi)容,參數(shù)maxSize指定了TextBox允許輸入的最大字符數(shù),如果輸入超過最大數(shù)目的字符,則會拋出異常。參數(shù)constraints指定了TextBox輸入內(nèi)容的限制類型,即只能輸入指定類型的字符。程序可以同時為每個TextBox設(shè)置它的輸入限制,可以限制輸入的字符串的類型??梢栽趧?chuàng)建TextBox對象的時候就設(shè)置constraints參數(shù),constraints參數(shù)可以是如下的幾種類型:

(1)ANY:允許輸入任何文本

(2)EMAILADDR:允許輸入一個Email地址

(3)NUMERIC:允許輸入輸入一個整數(shù)

(4)PHONENUMBER:允許輸入一個電話號碼

(5)URL:允許輸入一個網(wǎng)絡(luò)URL地址

(6)PASSWORD:允許輸入字符被*號代替的密碼4.3.2List一個屏幕可能包含有多個選擇,每個選擇都是由一個標(biāo)題描述實際功能,MIDP提供了List屏幕類來進(jìn)行處理這方面的要求。List屏幕類用來成列地顯示數(shù)據(jù),列表屏幕的表項通常包括圖標(biāo)和標(biāo)題兩部分,標(biāo)題用來對具體的功能進(jìn)行描述。List屏幕類的每一個類表項的功能就好像一個Command控件的功能,可以通過按下手機(jī)鍵盤的確定鍵(SELECT鍵)選擇它們,同時List屏幕類觸發(fā)相關(guān)的事件。創(chuàng)建一個List屏幕類的對象可以使用的構(gòu)造函數(shù)有兩種,它們的具體定義如下所示:List(Stringtitle,intlistType);List(Stringtitle,intlistType,String[]stringElements,Image[]imageElements);List創(chuàng)建一個List對象的代碼如下所示:1ListmainList;2String[]stringArray={//列表的標(biāo)題組“TextboxA”,“TextboxB”,“TextboxC”,};3mainList=newList(“ListExample”,Choice.IMPLICIT,stringArray,null);4mainList.addCommand(exitCommand);5mainList.addCommandListener(this);ListList屏幕對象可以使用構(gòu)造函數(shù)一次性的把所有列表選項都顯示出來,也可以通過append()函數(shù)動態(tài)的向List添加新的列表項。例如在原來的列表基礎(chǔ)上新添加2個列表項的代碼如下所示:

mainList.append(“TextboxD”,null);//List屏幕添加一個列表項

mainList.append(“TextboxE”,null);List如果需要在列表選項左邊顯示圖片,則要指定圖片數(shù)組,創(chuàng)建List的時候作為構(gòu)造函數(shù)的第4個函數(shù)代入即可,如果不顯示,則可以使用“null”為參數(shù)。創(chuàng)建一個圖片數(shù)組的例子代碼如下所示:1Image[]imageArray=null;2try{//指定png格式的圖片的路徑3Imageicon=Image.createImage(“/Icon.png”);4imageArray=newImage[]{//圖像數(shù)組

icon, icon, icon };}catch(java.io.IOExceptionerr){5imageArray=null;6}

第3行代碼指定了圖片保存的路徑“/Icon.png”,這個路徑表示名稱為“Icon.png”的圖片是存放在程序所在項目的根目錄下的。目前List屏幕對象支持的圖片類型只能是“.png”格式的圖片。ListMIDP2.0中,List的類型有以下3種表現(xiàn)方式:1.隱含方式Choice.IMPLICIT

隱含方式是一種設(shè)置默認(rèn)選項的模式,在一組列表選項中,只能選擇其中的一個列表選項。2.單選方式Choice.EXClUSlVE

單選方式就是在一組幾個列表選項中,只能有一個列表選項被選擇,但是在選項的左邊出現(xiàn)一個圓形的單選框。3.多選方式Choice.MULTIPLE多選方式就是在一組幾個列表選項中,可以有多個列表選項同時被選擇,在列表選項的右邊出現(xiàn)一個正方形的復(fù)選框,選擇以后將會出現(xiàn)一個打勾符號。List下面的例子展現(xiàn)了如何顯示一個帶圖標(biāo)的隱含方式(Choice.IMPLICIT)的List屏幕,具體的代碼如下所示:importjavax.microedition.lcdui.*;importjavax.microedition.midlet.MIDlet;publicclassListControlextendsMIDlet{ privateListmainList; privateDisplaydisplay; privatebooleanfirstTime; publicListControl(){ display=Display.getDisplay(this); firstTime=true; } protectedvoidstartApp(){ if(firstTime){ //創(chuàng)建一個圖形對象

Image[]imageArray=null;Listtry{ //從資源目錄讀取圖片資源

Imageicon=Image.createImage("/Icon.png"); //注意,每個List選項都需要一個圖標(biāo)

imageArray=newImage[]{icon,icon,icon,icon}; }catch(java.io.IOExceptionerr){ System.out.print("loadfailed..."); } //屏幕類表項的名稱

String[]stringArray={"List1","List2","List3","List4"}; //創(chuàng)建一個隱患的列表屏幕對象mainList=newList("Choosetype",Choice.IMPLICIT,stringArray,imageArray); //顯示List屏幕

display.setCurrent(mainList); firstTime=false; } } protectedvoidpauseApp(){ } protectedvoiddestroyApp(booleanarg0){ }}List創(chuàng)建List對象的時候一個比較重要的事情就是,字符串?dāng)?shù)組的的長度必須和圖像數(shù)組的長度一致,否則將會拋出IllegalAIIgumentException異常。選擇一個List的列表選項以后,如何處理相應(yīng)的事件?以下的例子將展示如何處理IMPLICIT類型的List屏幕列表項的事件,例子具體的代碼如下所示:publicvoidcommandAction(Commandc,Displayabled){ if(d.equals(mainList)){ //按下手機(jī)鍵盤的Select鍵,即確定鍵

if(c==List.SELECT_COMMAND){ if(d.equals(mainList)){ //判斷選擇了哪一個列表項

switch(((List)d).getSelectedIndex()){ case0: tb.setString("TextboxA"); display.setCurrent(tb); break; case1: tb.setString("TextboxB"); display.setCurrent(tb);break;Listcase2: tb.setString("TextboxC"); display.setCurrent(tb); break; } } } }else{ //返回主屏幕

if(c==backCommand){ display.setCurrent(mainList); } } if(c==exitCommand){ destroyApp(false); notifyDestroyed(); } }}List對于多選框List的事件處理,類似單選框的事件處理方法,不同的是需要通過getSelectedFlags(boolean[]selectedArrayreturn)數(shù)獲得哪幾個List的列表項已經(jīng)被選擇了,選擇的結(jié)果存儲在一個布爾數(shù)組中,以下的例子將展示如何處理MULTIPLE類型的List的事件,即當(dāng)選擇了多個List列表選項以后如何知道究竟都選擇了哪幾個列表項,并且處理相應(yīng)的事件。具體的代碼如下所示:publicvoidcommandAction(Commandc,Displayabled){ if(d.equals(mainList)){ if(c==okCommand){ if(d.equals(mainList)){ String[]stringTextbox={"Selected1","Selected2", "Selected3"};Listboolean[]selectedArray=newboolean[3]; mainList.getSelectedFlags(selectedArray); inti=0; Stringstr=""; for(i=0;i<3;i++) if(selectedArray[i]==true){ str=str+stringTextbox[i]+"\n"; } tb.setString(str); display.setCurrent(tb); } } }else{ if(c==backCommand){ display.setCurrent(mainList); } } if(c==exitCommand){ destroyApp(false); notifyDestroyed(); } }}4.3.3Alert當(dāng)程序出現(xiàn)錯誤,就需要提醒用戶?;蛘弋?dāng)一個程序需要運(yùn)行很長時間,比如說一個游戲開始讀取數(shù)據(jù)的時間比較長,此時最好可以顯示一個等待畫面。Alert類就是這樣一個顯示等待或者錯誤信息的屏幕類。既然它也是屏幕類,所以它可以在屏幕上顯示圖片以及文字。Alert的功能類似Windows操作系統(tǒng)的彈出對話框功能,用來提示用戶一些特定的信息。比如當(dāng)用戶選擇關(guān)閉程序,就可以創(chuàng)建一個Alert對象,提示用戶是否需要保存設(shè)置才關(guān)閉程序。創(chuàng)建一個Alert對象需要使用到它的構(gòu)造函數(shù),Alert的構(gòu)造函數(shù)的原型有2個:Alert(Stringtitle);Alert(Stringtitle,StringalertText,ImagealertImage,AlertTypealertType);

其中參數(shù)“title”指定了Alert屏幕的標(biāo)題,參數(shù)“alertText”指定了Alert屏幕需要顯示的提示信息,參數(shù)“alertlmage”指定了Alert屏幕需要顯示的圖片,參數(shù)“alertType”指定了Alert屏幕的類型。Alert1.Alert的類型由于Alert是作為提示信息的屏幕,而信息的類型可能很多,所以Alert也細(xì)分了顯示信息的不同類型,目前Alert的類型有以下5種:

(1)AlertType.ALARM:提示已經(jīng)通知系統(tǒng)處理用戶請求的前一個事件

(2)AlertType.CONFIRMATION:提示用戶確認(rèn)

(3)AlertType.ERROR:提示錯誤信息

(4)AlertType.INFO:提供給用戶非威脅性的信息

(5)AlertType.WARNING:警告用戶在進(jìn)行具有潛在危險的操作

2.Alert的等待

Alert可以設(shè)置Alert對象存在的時問,Alert等待的時間是用毫秒計算的,可以使用setTimeout(inttime)函數(shù)設(shè)置Alert屏幕存在的時間。如果希望Alert對象永遠(yuǎn)存在,參數(shù)可以設(shè)置為“Alert.FOREVER”,如果設(shè)置為“Alert.FOREVER”,用戶只能通過激活A(yù)lert對象中的Done命令按鈕才能解除Alert對象。Alert3.Alert的Command對象

Alert類繼承于Displayable類,雖然Alert同時也繼承了Displayable的addCommand函數(shù),但是如果使用該函數(shù),將會拋出IllegalStateException異常,這是因為Alert屏幕對象很特殊,不同于其他的屏幕對象,它只能作為提示信息,所以它不能添加自己的命令對象。如果需要有特定的命令按鈕的提示性屏幕,那么就需要使用其他Screen類或者使用低級界面API屏幕類來向用戶顯示信息。

4.Alert的下一個顯示屏幕(Displayable)Alert屏幕設(shè)置的等待時間過去以后或者觸發(fā)了Alert屏幕上的Done按鈕,程序?qū)⑼顺鯝lert屏幕,然后轉(zhuǎn)移到下一個屏幕,如果使用Display.setcurrent(DisplayablenextDisplayablel方法,例如:Display.setcurrent(alert),將默認(rèn)為轉(zhuǎn)移到原來觸發(fā)Alert對象的屏幕。如果使用Display.setcurrent(Alertalert,DisplayablenextDisplayable)方法,則轉(zhuǎn)移到nextDisplayable屏幕。Alert5.MIDP2.0新添加的selIndjcator(Gaugeindicator)函數(shù)使用setlndicator函數(shù)可以在顯示Alert屏幕的時候顯示一個進(jìn)度條,Gauge是一個進(jìn)度條對象,下面章節(jié)將會詳細(xì)介紹。在Alert屏幕中使用進(jìn)度條控件非常簡單,使用這個函數(shù)的例子代碼如下所示:1Alertalert=newAlert(“Alert”,2“ThisisaAlertExample!”,img,AlertType.INFO);3Gaugeindicator=newGauge(null,false,max,0);4alert.setIndicator(indicator);

當(dāng)然也可以使用一個后臺線程設(shè)置進(jìn)度條Gauge對象的進(jìn)程顯示情況,相關(guān)知識將在Gauge小節(jié)詳細(xì)介紹。4.3.4FormForm是一個特殊的屏幕類,它的最大特點就是它本身不僅僅是一個屏幕,而且是控件的容器,在這個容器上可以放置多種控件,比如圖像、只讀文本、可編輯文本域、可編輯日期域還有多選按鈕等等控件。Form類可以放置繼承了javax.microedition.lcdui.Item類的任何控件,并不象List和TextBox類一樣,在屏幕上只存在單一的功能。每一個Item控件都只能夠放置在一個Form類容器中,如果企圖同時放置在不同的容器中,就會拋出IllegalStateException異常。FormForm容器對放置在它上面的控件的布局是有一定的規(guī)則的,一般來說,每放置一個控件,控件可以設(shè)置自身的布局,如果沒有設(shè)置,則默認(rèn)為Form類新建一行屏幕空間用來放置該控件,并且該控件是從左到右設(shè)置的。如果控件較大,則Form類會自動調(diào)整控件占有行數(shù)的多少,但是一般控件的寬度就是屏幕的寬度,不會出現(xiàn)水平滾動條,但是當(dāng)控件太多,會自動出現(xiàn)垂直滾動條。由于沒有水平滾動條和屏幕大小的限制,文本可能被重新排版,圖像可能被裁減。在MIDP2.0中,F(xiàn)orm類的Item控件可以指定最小尺寸和最合適的尺寸,同時可以設(shè)置它們自身在容器中的布局。Form容器對它里面的控件是通過焦點來控制,通過移動焦點,可以對焦點所在的控件進(jìn)行操作。一個Form類的創(chuàng)建非常簡單,例如創(chuàng)建一個Form屏幕對象的代碼如下所示:privateFormmainForm;mainForm=newForm(“Ticker例子”);Form類的對象可以通過append()函數(shù)添加新的控件,例如下面的代碼添加了一個TextField類型的控件:mainForm.append(newTextField(“hello”,null,25,TextField.ANY);4.3.5Ticker

Ticker是一個特殊的屏幕控件,它的作用就是在其他的屏幕對象上顯示滾動的文字。任何一個屏幕類都可以使用setTicker()函數(shù)設(shè)置Ticker控件。Ticker控件可以在創(chuàng)建的時候指定要顯示的文字,也可以使用setString()函數(shù)指定要顯示的文字。下面的例子創(chuàng)建了一個Form類,然后把這個Form類與一個Ticker關(guān)聯(lián)起來,然后在屏幕上會自動顯示一個滾動的Ticker控件。注意,有時候滾動條在某些手機(jī)上面無法正常顯示,因為要看手機(jī)是否支持Ticker控件。Tickerimportjavax.microedition.lcdui.*;importjavax.microedition.midlet.MIDlet;publicclassTickerDemoextendsMIDlet{ privatestaticfinalStringTICKER_TEXT="這是一個滾動條例子"+"正在滾動,可以一直滾動"+"除非有觸發(fā)了停止事件";privateFormmainForm;publicTickerDemo(){mainForm=newForm("Ticker例子");}protectedvoidstartApp(){Tickert=newTicker(TICKER_TEXT);mainForm.setTicker(t);Display.getDisplay(this).setCurrent(mainForm);}protectedvoiddestroyApp(booleanunconditional){}protectedvoidpauseApp(){}}4.4Item控件實例Form屏幕類是控件的容器,而能夠往Form類這個容器里面放置的控件都是繼承Item類的控件。所有繼承Item類的控件都擁有標(biāo)題屬性,標(biāo)題一定是與控件放置在同一行,或者放在上一行的位置,具體位置是根據(jù)屏幕大小由系統(tǒng)自動調(diào)整的。當(dāng)Item類的控件在屏幕不能完全可見的時候,MIDP會盡量使標(biāo)題屬性和控件可見性保持一致。

MIDP2.0開始允許開發(fā)人員調(diào)整控件在Form中的布局。目前支持的布局屬性如表所示。

Item空間實例Item控件實例表中的布局屬性可以使用setLayout(intlayout)來設(shè)置,可以同時使用多個布局屬性,多個布局屬性使用符號“|”間隔開,也可以使用getLayout()獲得當(dāng)前控件使用的屬性。每個控件的尺寸都有2個屬性:最小尺寸和最佳尺寸。最小尺寸的作用就是當(dāng)其他控件或者標(biāo)題占用了一定的空間,容器將判斷控件所需要的空間大小,如果連最小尺寸的空間都不夠了,則把控件放在新的一行上。最佳尺寸相當(dāng)于在空間允許的情況下,容器空間的安排盡量靠近控件的最佳尺寸??梢允褂胹etPreferredSize()函數(shù)設(shè)置最佳尺寸。4.4.1TextField

TextField是一個文本輸入控件,它的功能類似TextBox屏幕控件,不同的是TextBox本身就是一個屏幕類,可以使用Display.setCurrent()函數(shù)在屏幕上顯示出來,而TextField必須放置在Form屏幕類中才能夠顯示出來。創(chuàng)建一個TextField對象的控件必須設(shè)置它的構(gòu)造函數(shù),它的構(gòu)造函數(shù)的原型如下所示:TextField(Stringlabel,Stringtext,intmaxSize,intconstraints)

其中參數(shù)“l(fā)abel”設(shè)置了控件的標(biāo)題,參數(shù)“text”設(shè)置了默認(rèn)顯示的內(nèi)容,參數(shù)“maxSize”指定了控制能夠容納的最大字符數(shù),如果超過指定的最大字符數(shù)則拋出異常。參數(shù)“constraints”指定了顯示內(nèi)容的限制屬性,TextField控件與TextBox中的限制屬性是一樣的。TextField下面的例子展示了如何創(chuàng)建一個Form屏幕類,然后使用Form類的append()函數(shù)動態(tài)地添加各種類型的TextField控件。具體的代碼如下所示:importjavax.microedition.midlet.MIDlet;importjavax.microedition.lcdui.*;publicclassTextFieldDemoextendsMIDletimplementsCommandListener{ privateCommandexitCommand=newCommand("退出",Command.EXIT,1); privateFormmainForm; publicTextFieldDemo(){ mainForm=newForm("TextField"); } protectedvoidstartApp(){ mainForm.append("顯示各種類型的TextField"); mainForm.append(newTextField("任何字符","",15,TextField.ANY));TextFieldmainForm.append(newTextField("E-Mail","",15,TextField.EMAILADDR));mainForm.append(newTextField("數(shù)字","",15,TextField.NUMERIC));mainForm.append(newTextField("浮點數(shù)","",15,TextField.DECIMAL));mainForm.append(newTextField("電話","",15,TextField.PHONENUMBER));mainForm.append(newTextField("密碼","",15,TextField.PASSWORD));mainForm.append(newTextField("網(wǎng)址URL","",15,TextField.URL));mainForm.addCommand(exitCommand);mainForm.setCommandListener(this); Display.getDisplay(this).setCurrent(mainForm); } publicvoidcommandAction(Commandc,Displayables){ if(c==exitCommand){ destroyApp(false); notifyDestroyed(); } } protectedvoiddestroyApp(booleanunconditional){} protectedvoidpauseApp(){}}TextField程序運(yùn)行以后如圖所示,F(xiàn)orm類屏幕上分別添加了各種類型的TextField控件,輸入的字符只能夠輸入指定類型的字符,屬于其他類型的字符將不能夠輸入。例如密碼類型的TextField輸入的數(shù)據(jù)將會自動使用“*”號掩藏起來。4.4.2ImageItemImageltem是一個圖形顯示控件,它的特點是把一幅圖像可以作為Form類的一個控件在屏幕上顯示出來。在MIDP2.0中,Imageltem控件增加了2個附加的功能,可以做為圖形按鈕或者網(wǎng)址超級鏈接的圖片。創(chuàng)建一個Imageltem對象的控件必須設(shè)置它的構(gòu)造函數(shù),Imageltem擁有2個構(gòu)造函數(shù),它們的原型如下所示:publicImageItem(Stringlabel,Imageimg,intlayout,StringaltText)publicImageItem(Stringlabel,Imageimg,intlayout,StringaltText,intappearanceMode)

其中參數(shù)“l(fā)abel”設(shè)置了控件的標(biāo)題,參數(shù)“img”設(shè)置要顯示的Image圖像對象,參數(shù)“l(fā)ayout”指定了控件的布局,參數(shù)“altText”指定了如果不能夠顯示圖片或者圖片對象不存在,則使用一個字符串代替圖片控件,altFext參數(shù)就存儲了這個替代功能的字符串。參數(shù)“appearanceMode”指定了Imageltem控件的類型,它共有3個類型,如下所示:

(1)Item.PIAIN類型:默認(rèn)類型

(2)Item.HYPERLINK類型:超級鏈接類型

(3)Item.BUTTON類型:圖像按鈕類型如果沒有指定appearanceMode參數(shù),則默認(rèn)為Item.PLAIN類型。

ImageItem下面的例子首先創(chuàng)建了一個Form屏幕類,然后添加了兩個Item.PLAIN類型的Imageltem控件,這兩個Imageltem控件使用了不同的布局類型,一個使用默認(rèn)的布局類型,一個使用了擴(kuò)展可用寬度和控件處于新一行的布局類型,具體的代碼如下所示:importjavax.microedition.midlet.MIDlet;importjavax.microedition.lcdui.*;publicclassImageItemDemoextendsMIDletimplementsCommandListener{ privateCommandexitCommand=newCommand("退出",Command.EXIT,1); privateFormmainForm; privateImageItempngItem_1,pngItem_2; publicImageItemDemo(){ mainForm=newForm("ImageItem"); } protectedvoidstartApp(){ mainForm.append("顯示各種類型的ImageItem"); try{

pngItem_1=newImageItem("默認(rèn)圖像控件",Image.createImage("/Image.png"),Item.LAYOUT_DEFAULT,"小豬圖片"); pngItem_2=newImageItem("默認(rèn)圖像控件",Image.createImage("/Image.png"),Item.LAYOUT_2|Item.LAYOUT_EXPAND|Item.LAYOUT_NEWLINE_BEFORE,"小豬圖片");ImageItem}catch(Exceptione){ System.out.println("loadimageerror"); } mainForm.append(pngItem_1); mainForm.append(pngItem_2); mainForm.addCommand(exitCommand); mainForm.setCommandListener(this); Display.getDisplay(this).setCurrent(mainForm); } publicvoidcommandAction(Commandc,Displayables){ if(c==exitCommand){ destroyApp(false); notifyDestroyed(); } } protectedvoiddestroyApp(booleanunconditional){ } protectedvoidpauseApp(){ }}ImageItem

程序運(yùn)行以后效果如圖所示,分別顯示了2幅相同的圖片。但是由于布局不同,標(biāo)題占用的空間不同。第一幅圖片的標(biāo)題“默認(rèn)圖像控件”占用了屏幕的2行控件,這個標(biāo)題的字符串的寬度剛好與圖片的寬度一樣;第2幅圖片的標(biāo)題則沒有占用2行,因為圖片雖然大小沒有改變,但是提供給第2幅圖片顯示的空間是整個屏幕寬度大小的空間,所以標(biāo)題也可以使用屏幕寬度大小的空間。

4.4.3StringItem

StringItem控件就是顯示只讀信息的Item控件,用戶不能夠更改控件的提示信息。它的功能類似其他控件標(biāo)題的作用,但是由于它本身是一個控件,所以它有其他控件標(biāo)題所不具備的特點,就是可以使用控件布局,安排信息的顯示位置。MIDP2.0開始,StremItem控件添加了2個功能,就是可以作為字符串按鈕和超級鏈接控件,創(chuàng)建一個StreamItem控件必須使用它的構(gòu)造函數(shù),它擁有2個構(gòu)造函數(shù),具體如下所示:publicStringItem(Stringlabel,Stringtext)publicStringItem(Stringlabel,Stringtext,intappearanceMode);

其中參數(shù)“l(fā)abel”指定了StringItem控件的標(biāo)題,參數(shù)“text”指定了需要顯示的文本信息,參數(shù)“appearanceMode”指定控件顯示的類型,它共有3個類型,如下所示:

(1)Item.PLAIN類型:默認(rèn)類型

(2)Item.HYPERLINK類型:超級鏈接類型

(3)Item.BUTTON類型:圖像按鈕類型創(chuàng)建一個StringItem控件很簡單,但是當(dāng)StringItem做為按鈕控件或者超級鏈接控件的時候,需要處理按鈕按下事件。在Item控件中是使用ItemCommandListener()函數(shù)設(shè)置監(jiān)聽器,然后在commandAction(Commandc,Itemitem)函數(shù)中處理事件,需要注意的是commandAction(Commandc,Itemitem)函數(shù)的第2個參數(shù)是Item控件,并不是以前程序中的Displayable參數(shù)。當(dāng)然程序需要繼承ItemCommandListener監(jiān)聽器接口。StringItem

下面的例子展示了3種StringItem控件的使用方法,當(dāng)選Item.HYPERLINK類型和Item.BUTTON類型的StringItem控件的時候,將會出現(xiàn)一個“Go”和“Press”按鈕,按下該“Go”按鈕,程序會切換到一個Alert屏幕。具體代碼如下所示:importjavax.microedition.lcdui.*;importjavax.microedition.midlet.MIDlet;publicclassStringItemDemoextendsMIDletimplementsCommandListener,ItemCommandListener{privateDisplaydisplay;privateFormmainForm;privatefinalstaticCommandhttpCommand=newCommand("Go",Command.ITEM,1);privatefinalstaticCommandokCommand= newCommand("Press",Command.ITEM,1);privatefinalstaticCommandexitCommand= newCommand("Exit",Command.EXIT,1);StringItem

protectedvoidstartApp(){display=Display.getDisplay(this);mainForm=newForm("StringItemDemo");StringItemitem=newStringItem("標(biāo)題:","StringItem具體內(nèi)容");mainForm.append(item);item=newStringItem("Hyper-Link","/sports",Item.HYPERLINK);item.setDefaultCommand(httpCommand);item.setItemCommandListener(this);mainForm.append(item);item=newStringItem("","確定",Item.BUTTON);item.setDefaultCommand(okCommand);item.setItemCommandListener(this);mainForm.append(item);mainForm.addCommand(exitCommand);mainForm.setCommandListener(this);display.setCurrent(mainForm);}StringItem

publicvoidcommandAction(Commandc,Itemitem){if(c==httpCommand){Stringtext="正在連接網(wǎng)絡(luò).....";Alerta=newAlert("URL",text,null,AlertType.INFO);display.setCurrent(a);}elseif(c==okCommand){Stringtext="你單擊了【確定】按鈕...";Alerta=newAlert("Action",text,null,AlertType.INFO);display.setCurrent(a);}}publicvoidcommandAction(Commandc,Displayabled){destroyApp(false);notifyDestroyed();}protectedvoiddestroyApp(booleanunconditional){}protectedvoidpauseApp(){}}StringItem

程序運(yùn)行以后效果如圖所示,屏幕上顯示了3個Stringltem控件,前2個Stringltem控件都有自己的標(biāo)題,按鈕控件沒有設(shè)置標(biāo)題。選擇第2個StringItern控件的時候,屏幕右下角將顯示一個“Go”按鈕,按下屏幕上的“Go”按鈕將會出現(xiàn)一個提示“正在連接網(wǎng)絡(luò)”的Alert屏幕。4.4.4ChoiceGroup

ChoiceGroup是一個多選控件,功能與List屏幕的功能類似,都是提供多種選擇的功能。不同是ChoiceGroup是一個Item控件,ChoiceGroup控件有2個不同的構(gòu)造函數(shù),只有放置在容器內(nèi)才能夠在屏幕上顯示和使用。它們?nèi)缦滤荆簆ublicChoiceGroup(Stringlabel,intchoiceType)publicChoiceGroup(Stringlabel,intchoiceType,String[]stringElements,Image[]imageElements)

其中,參數(shù)“l(fā)abel”指定了控件的標(biāo)題屬性,參數(shù)“choiceType”指定了控件的顯示類型,它共有3種類型,MIDP2.0還提供了一個PoPup下拉列表控件,這3種類型的常量是Choice.EXCLUSIVE、Choice.MULTIPLE和Choice.POPUP。參數(shù)“stringElements”指定了Choice.EXCLUSIVE、Choice.MULTIPLE和Choice.POPUP類型的ChoiceGroup控件顯示的選項字符串,而參數(shù)“imageElements”則指定了相應(yīng)的圖片數(shù)組。

MIDP2.0中,ChoiceGroup新添加了一個設(shè)置選項字體的功能,使用setFont()函數(shù)可以設(shè)置ChoiceGroup選項的的字體。由于MIDP2.0提供的下拉列表控件與List屏幕的功能有點不一樣,它可以繼承ItemStateListener監(jiān)聽接口,使用setItemStateListener()數(shù)設(shè)置GroupChoice控件的列表項的監(jiān)聽器,在itemStateChanged()數(shù)中處理監(jiān)聽事件。

ChoiceGroup

下面的例子展示了如何創(chuàng)建一個下拉列表類型的ChoiceGroup控件,選擇ChoiceGroup控件的某個選項以后,將在一個TextField控件中顯示提示選擇的信息,具體的代碼如下所示:importjavax.microedition.lcdui.*;importjavax.microedition.midlet.*;publicclassChoiceGroupDemoextendsMIDletimplementsCommandListener,ItemStateListener{ privatefinalstaticCommandexitCommand=newCommand("Exit",Command.EXIT,1); privateDisplaydisplay; privateFormmainForm; privateTextFieldtextfield; privateChoiceGroupgroup; publicChoiceGroupDemo(){ } protectedvoidstartApp(){ display=Display.getDisplay(this); mainForm=newForm("ChoiceGroup"); mainForm.append("Thesearetheavailablechoicegroup"); Image[]imageArray=null;ChoiceGroup

try{ Imageduke=Image.createImage("/Icon.png"); imageArray=newImage[]{duke,duke,duke,duke}; }catch(java.io.IOExceptionerr){ } String[]stringArray={"選項A","選項B","選項C","選項D"};group= newChoiceGroup("Pop-Up",ChoiceGroup.POPUP,stringArray,imageArray);textfield=newTextField("當(dāng)前選項為:","選項A",20,TextField.ANY); mainForm.append(group); mainForm.append(textfield); mainForm.addCommand(exitCommand); mainForm.setCommandListener(this); mainForm.setItemStateListener(this); display.setCurrent(mainForm); }ChoiceGroup

publicvoidcommandAction(Commandc,Displayabled){ if(c==exitCommand){ destroyApp(false); notifyDestroyed(); } } protectedvoiddestroyApp(booleanunconditional){ } protectedvoidpauseApp(){ } publicvoiditemStateChanged(Itemitem){ if(iteminstanceofChoiceGroup){ textfield.setString(group.getString(group.getSelectedIndex()));} }}ChoiceGroup

程序運(yùn)行以后的效果如圖所示,選擇了下拉列表項“選項B”以后,將在下面的TextField控件中出現(xiàn)“選項B”的提示信息。4.4.5DateField

MIDP提供了一個可以用來選擇時間和日期的DateField控件,使用這個控件可以很方便輸入時間和日期,DateField有2個構(gòu)造函數(shù),具體如下所示:DateField(Stringlabel,intmode)DateField(Stringlabel,intmode,TimeZonetimeZone)

其中,參數(shù)“l(fā)abel”指定了控件的標(biāo)題,參數(shù)“mode”指定了控件的類型,共有3種類型:DATE、TIME和DATE_TIME類型。這3種類型分別可以輸入日期、時間和日期時間。而參數(shù)“ti

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論