第3章圖形用戶界面體系結構_第1頁
第3章圖形用戶界面體系結構_第2頁
第3章圖形用戶界面體系結構_第3頁
第3章圖形用戶界面體系結構_第4頁
第3章圖形用戶界面體系結構_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第3章圖形用戶界面體系結構本章簡介本章介紹圖形用戶界面體系結構。由于資源方面的限制,沒有使用標準圖形界面類和,而是針對移動通信設備提供了名為受限設備用戶接口。實現(xiàn)了基于的用戶圖形界面。本章重點介紹圖形用戶界面的體系結構,講解屏幕管理類類,顯示類類,命令按鈕類和監(jiān)聽器接口。圖形用戶界面對于應用程序非常重要,因為它是程序與用戶之間交互的橋梁,針對移動通信設備MIDP提供了被稱為LCDUI的API集。來實現(xiàn)JavaME的圖形用戶界面設計。本章重點講述其提系結構。及其相關的類。3.1LCDUI體系結構在圖形用戶界面類庫lcdui中的界面類可以分成兩種類型:高級用戶界面類(Screen類)和低級用戶界面

2、類(Canvas類和Graphic類)。高層用戶界面由一些基于窗口UI組件構成,其特點:在高度抽象的水平上封裝了一些基本界面控件類,如Alert、List、TextBox和Form等;有較好的移植性;主要應用于業(yè)務處理的應用程序;對于高級用戶界面開發(fā)人員無須關心各種界面控件的顏色、字體和外觀等,不同的硬件設備上可能具有的不同細節(jié)設置;從而加速了界面的設計,縮短了開發(fā)周期。也正是這個特點使得開發(fā)人員對于屏幕的細節(jié)、主動捕獲一些特殊的事件幾乎束手無策。對于開發(fā)一些較為復雜界面顯得無能為力。為此LCDUI還提供了低級用戶界面類。低層用戶界面采用了基于像素的設計方法,其特點:允許設計者在屏幕上較精確地

3、繪制圖形;可以進行細致的布局、繪制每個像素點、接受較低層的事件、直接獲得用戶的按鍵消息;可以設計復雜的用戶交互。但是抽象較少,每一個組件都需程序員自己來繪制,大部分事件也都需要程序員自己去捕獲和處理,因此需要編寫較多的代碼;不能保證程序可以在不同的硬件設備上運行,也不能保證不同硬件設備的運行結果相同,可移植性差。高層用戶界面類和低層用戶界面類可以在同一個MIDlet中使用,但在同一個屏幕對象中,LCDUI包中最重要的類和接口有Display,Displayable,Command和CommandListener.圖3_1顯示了LCDUI包中重要的類和接口之間的繼承關系。圖3_1LCDUI的重要

4、類和接口3.2Display類Display類提供了訪問物理屏幕的通道,可以獲取設備屬性和請求在設備上顯示某一對象的方法。它是J2ME應用程序中的屏幕管理類,負責將各個界面顯示內容映射到實際硬件設備的屏幕上。我們可以使用靜態(tài)方法Display.getDisplay()獲得一個Display的實例。由于這個方發(fā)法是單態(tài)模式的,因此在MIDlet執(zhí)行的整個過程中,調用該方法只能獲得同一個Display對象的引用。該方法定義如下:publicstaticDisplaygetDisplay(MIDletm);其參數(shù)m用于指定返回哪個MIDlet對象的Display對象的引用。返回值是一個Display

5、類的對象。在任何時候,我們都可以調用該方法,每個MIDlet程序都只有一個自己的Display實例,在多數(shù)情況下,我們將獲得的Display實例作為成員變量,而避免多次調用getDisplay方法。獲得Display實例后,其顯示的內容Displayable對象并不馬上顯示在屏幕上,只有調用了Display實例的setCurrent()方法后,才將實例中的內容顯示到物理屏幕上。Displayable對象是在屏幕上顯示的視圖,在中任何時刻只能有一個Displayable對象是可見的。因此setCurrent()方法可以實現(xiàn)視圖轉換。Display類中定義了可以重載的兩種用法如下:publicvo

6、idsetCurrent(DisplayablenextDisplayable)publicvoidsetCurrent(Alertalert,DisplayablenextDisplayable)第一個方法設置在屏幕上顯示一個Displayable對象nextDisplayable;第二種方法是首先彈出警示框類的對象altert,當altert對象消失后再顯示Displayable對象nextDisplayable。關于使用該方法的時機:在生命周期中,MIDlet從暫停態(tài)轉換為激活態(tài)需調用startApp方法,而此時是調用setCurrent()方法的最佳時機,更新當前激活的MIDlet的屏

7、幕。當多個MIDlet類同時運行時,每一個MIDlet都保存自己的屏幕內容(Displayable對象),但只有處于激活狀態(tài)的MIDlet,通過調用setCurrent()方法將自己的屏幕內容顯示到設備的屏幕上。我們還可以通過getCurrent()方法可以獲得當前MIDlet顯示的屏幕。Display類還定義了getCurrent()方法,用于獲取當前顯示的Displayable對象。publicDisplayablegetCurrent();此外Display還定義了顯示當前設備顯示屬性的方法:獲取當前設備采用邊框類型的方法:publicintgetBorderStyle(Booleanh

8、ighlighted)參數(shù)highlighted表示是否為高亮度顯示邊框。返回值只能是下面兩個值中的一個:Graphics.DOTTED:虛線類型Graphics.SOLID:實線類型用于獲取圖像最佳寬度和高度的方法:publicintgetBestImageWidth(intimagetype)publicintgetBestImageHeight(intimagetype)參數(shù)imageType表示圖像類型,目前Display定義的圖像類型有3種:LIST_ELEMENT:用于List選項的圖像;CHOICE_GROUP_ELEMENT:用于ChioceGroup選項的圖像ALERT:用于

9、Alert提示的圖標。(3)判斷當前設備是否支持彩色顯示的方法:publicBooleanisColor()(4)獲取當前設備支持透明顯示的層數(shù)的方法:publicintnumAlphaLevels()(5)獲取當前設備支持彩色的個數(shù)或透明灰度級數(shù)的方法:publicintnumColor()(6)獲取當前設備定義的一些特定顏色屬性的方法:publicintgetColor(intcolorSpecifier)該方法以Ox00RRGGBB的格式返回指定顏色的RGB值。參數(shù)colorSpecifier是指定義的顏色標識,取值如表3_1所示:表3_1Display類中定義的顏色標識標識名稱常量描述

10、COLOR_BACKGROUND0指定屏幕的背景顏色COLOR_FOREGROUND1指定屏幕的前景顏色。靜態(tài)文本和用戶可編輯的字符前景顏色COLOR_HIGHLIGHTED_BACKGROUND2指定繪制并填充一個有焦點或者有焦點并咼亮顯示的巨型的顏色COLOR_HIGHLIGHTED_FOREGROUND3指定文本字符和簡單圖形高亮顯示時的顏色COLOR_BORDER4標識屏幕上沒有咼亮顯示的邊框的顏色COLOR_HIGHLIGHTED_BORDER5指定屏幕上被高亮顯示的邊框顏色下面例程序3_1演示了如何使用Display對象,判斷當前設備的屏幕是否支持彩色,如果支持則輸出它的顏色數(shù)量。

11、在構造方法中,我們通過getDisplay方法獲得當前屏幕類對象,存放在成員變量display中,使用Display類的isColor方法判斷當前設備是否支持彩色顯示,如果支持,則構造字符串“支持彩色顯示!共支持的顏色數(shù)是”;如果不支持,則構造字符串“不支持彩色顯示!透明等級是”,在這個程序中將字符串作為構造TextBox控件的顯示內容。在startApp方法中調用setCurrent方法,將TextBox控件顯示在屏幕上。例程序3_1程序名稱:TestColor.javaimportjavax.microedition.midlet.MIDlet;importjavax.microediti

12、on.lcdui.*;publicclassTestColorextendsMIDletimplementsCommandListenerprivateDisplaydisplay;privateTextBoxt;privateCommandexitCommand;publicTestColor()display=Display.getDisplay(this);exitCommand=newCommand(”退出,Command.SCREEN,1);Stringmessage=null;if(display.isColor()message=支持彩色顯示!共支持的顏色數(shù)是+display.n

13、umColors();elsemessage=不支持彩色顯示!;t=newTextBox(支持的顏色,:message,256,TextField.ANY);t.addCommand(exitCommand);t.setCommandListener(this);protectedvoidstartApp()display.setCurrent(t);protectedvoidpauseApp()protectedvoiddestroyApp(booleanunconditional)publicvoidcommandAction(Commandc,Displayabled)if(c=exit

14、Command)destroyApp(false);notifyDestroyed();圖3_2使用支持彩色模擬器運行結果,而圖3_3是使用不支持彩色的模擬器運行結果HEHst取鈉Keh。G$unTtaryita*!圖3_2使用支持彩色模擬器運行結果ieDiSplgya一個DlsPlay屏幕上顯示類實例,但可有多運行結果的抽象表示,是let只能有只有一個象是有效的。它Displayable對于低級用戶界面類;而SCreen包-Displayable對舟兩個直接子類:Screen和Canvas。其中Canvas及其子類屬屬于高級用戶界面類,并且有4個子類:Alert、Form、List和Text

15、Box。Displayable類是抽象類。由于它不提供公共的構造方法,因此開發(fā)人員不能直接使用它只能使用Displayable類的子類構造其對象。其主要方法可分為如下4類:(1)和界面標題有關的方法:設置界面標題publicvoidsetTitle(StringS);獲得界面標題publicStringgetTitle();和滾動條Ticker有關的類滾動條Ticker實現(xiàn)了播放一段不停滾動的文字,滾動的速度和方向由手機硬件決定。Ticker的構造方法:publicTicker(Stringstr);參數(shù)str就是搖滾動的文字。Ticker類通過getString()方法來獲得當前Ticker

16、中滾動的文字,通過setString()方法來設置滾動文字。由于加載Ticker的方法是在Displayable中定義的,所以其所有子類都可以加載Ticker。為當前Displayable子類對象加載Ticker的方法:publicvoidsetTicker(Tickerticker);獲得當前Displayable子類對象滾動條的方法:publicTickergetTicker();和顯示相關的方法前面我們提到使用Display類的setCurrent方法,可以設置當前屏幕中所顯示的Displayable對象,但這不是在所有的情況下都有效。當出現(xiàn)一些緊急事件需要處理時,JAM可能將當前正在執(zhí)

17、行的應用程序放置在后臺運行,相應地,可能將該應用程序的Displayable對象也被放置在后臺,而此時應用程序并不知道自己的Displayable對象已經被移至后臺,可能會出現(xiàn)錯誤,為此,應用程序需通過調用isShown方法獲得自己的Displayable對象是否在屏幕可見。確認該Displayable對象是否正在顯示。publicBooleanisShown()獲取當前當前Displayable對象的寬度:publicintgetWidth();獲取當前當前Displayable對象的高度:publicintgetHeight();處理Displayable類對象的大小改變事件:Protec

18、tedvoidsizeChanged(intw,inth)。(4)和命令按鈕相關的方法任何Displayable對象允許添加若干Command類對象,用于響應用戶在界面上的按鍵;該命令可以通過setCommandListener方法綁定一個命令觸發(fā)監(jiān)聽器,一旦用戶根據(jù)界面提示,按下數(shù)字鍵盤上的某一個按鍵后,命令觸發(fā)監(jiān)聽器會捕捉到該事件并做出相應的處理;監(jiān)聽器CommandListener的處理程序也就是這個接口中唯一的方法為:CommandAction();向當前Displayable對象添加一個菜單命令PublicvoidaddCommand(Commandcmd);刪除一個菜單命令Publ

19、icvoidremoveCommand(Commandcmd);為Displayable類對象設置監(jiān)聽器PublicvoidsetCommandListener(CommandListenerlis);例程序3-2演示了如何使用Displayable對象,為Displayable對象的子類textBox對象設置了標題、滾動條以及高度和寬度的信息,和滾動條。例程序3_2程序名稱:TestDisplayable.javaimportjavax.microedition.midlet.*;importjavax.microedition.lcdui.*;publicclassTestDisplaya

20、bleextendsMIDletprivateDisplaydisplay;privateTextBoxtextBox;privateTickerticker;publicTestDisplayable()display=Display.getDisplay(this);textBox=newTextBox(Displayable對象,”測試Displayable對象,50,0);ticker=newTicker(”我喜歡javaME,定努力學習!);textBox.setTicker(ticker);textBox.setTitle(”標題內容);Stringheight=Displayab

21、le對象的高度:+textBox.getHeight();Stringwidth=Displayable對象的寬度:+textBox.getWidth();textBox.setString(height+width);publicvoidstartApp()display.setCurrent(textBox);publicvoidpauseApp()publicvoiddestroyApp(booleanuncondition)運行結果如圖3_4圖34TestDisPIlayableava運行;會splayable是是抽象類;在這個例子中我們注意到生它的子類實例,因此例3_2中的方法都是通

22、過Displ序中的TextBox類就是DisplayDiable的一個子結果我們不能直接產生它的實例,而只能產yable子類的實例完成調用的。如該例程類,Text*:峙0斗對象textBox調用了Displayable類的icker是運行在TextBox類getHeight、getWidth、setTitle和上面的一個滾動條,它直接繼承自Displayable類,同其他控件(如TextBox)是并列關系,但setTicker方去吩在例程序3_2中,匚Jhl直誹Kelp國+555DOOO-DefaultColorP.aTriiilFEC3題戲惠爍苗ME,定豊土爭31二窗旳胡站魚的島嵐255Di

23、spavabeX+的甌訓設置滾動條時,需要使用控件的setTicker方法進行設置,如textBox.setTicker(myTicker).3.4Command類和監(jiān)聽器類CommanListener接口菜單命令是實現(xiàn)用戶和設備交互的重要工具。在手機上,菜單命令一般是以列表的形式被放在手機屏幕的菜單按鈕區(qū)域。在程序中被抽象為類對象。3.4.1Command類Command類產生的實例表示一個命令的控件,該控件用于提供給用戶執(zhí)行某個特定命令的處理接口,完成用戶與程序的交互。Command類是用于高層界面交互的類。Command類構造方法定義如下:publicCommand(Stringlabe

24、l,intcommandType,intpriority)Command類的構造方法需要三個參數(shù):label是命令按鈕上顯示的標簽,commandType命令按鈕的類型和priority是命令按鈕的優(yōu)先級,數(shù)值越小表示優(yōu)先級越高。命令按鈕的類型和優(yōu)先級共同影響某一命令按鈕在按鈕區(qū)出現(xiàn)的位置和順序。構造方法的返回值表示構造完畢的Command類實例。如下語句格式定義了一個Command類實例:CommandexitneCommand(退出,Command.EIT,1)其中,第一個參數(shù)退出表示該命令在屏幕中所顯示的標題;Command.EIT表示命令的類型,有關命令類型及其說明如表3-2所示;第三

25、個參數(shù)1定義了優(yōu)先級,JAM根據(jù)優(yōu)先級的高低處理命令之間的沖突。表3-2CommandType(類型)有如下八種可取的值:類型名稱常量值描述SCREEN1該類型命令一般用于整個屏幕或者屏幕之間的切換,相對于ITEM類型只是屏幕的一部分切換BACK2用于返回前一個屏幕,不過這個返回過程不是由命令自動完成,需要開發(fā)人員定義程序的實際行為。CANCEL3用于對當前屏幕對話框內容的否定回答,一般表示取消某操作,返回前一個屏幕OK4用于對當前屏幕對話框內容的肯定回答,該命令執(zhí)行后會調到下一個屏幕HELP5該命令指定一個在線幫助的請求,用于展示一些幫助信息STOP6用于停止正在運行的進程后操作。同樣停止行

26、為需要開發(fā)人員定義EXIT7該命令用于推出應用程序。釋放資源。ITEM8該命令是屏幕的一個條目或者Choice組件的一個兀素(如List)可以使用該類命令實現(xiàn)內容敏感的菜單一旦對Command類的實例構造完成,就不能再對標題、類型和優(yōu)先級進行任何修改,但允許我們獲得一個已經存在的Command類實例的標題、類型和優(yōu)先級,它們分別使用是方法:getLabel()、getCommandType()和getPriority()。3.4.2CommandListener接口當一個用戶選中一個菜單命令時程序與用戶的交互是通過命令觸發(fā)監(jiān)聽器來實現(xiàn)的,這需要Screen子類的實例實現(xiàn)CommandListe

27、ner接口。該接口中只定義了一個方法響應用戶命令的處理過程。publicvoidcommandAction(Commandc,Displayabled)參數(shù)C是當前用戶選中的菜單命令按鈕,d是包含了菜單命令的Displayable類對象。一般情況下使用命令監(jiān)聽接口實現(xiàn)程序與用戶交互編程步驟如下:程序先定義一系列的命令(Command類的實例)。添加Command類的實例到Displayable類的對象中,女口Form、Alert、List、TextBox等。調用Displayable類的setCommandListener方法,將接口應用于指定的對象,如textBox.setCommandLi

28、stener(ListenerName)。然后將需要響應用戶命令的類聲明為實現(xiàn)CommandListener的接口,最后編寫該接口中的方法commandAction方法處理這些用戶命令。下面例程序3_3提供了CommandListener監(jiān)聽接口的使用方法。例程序3_3程序名:TestCommandListener.javaimportjavax.microedition.midlet.*;importjavax.microedition.lcdui.*;publicclassTestCommandListenerextendsMIDletimplementsCommandListenerpr

29、ivateDisplaydisplay;privateTextBoxtextBox;privateCommandopenCommand;privateCommandeditCommand;privateCommandsaveCommand;privateCommandundoCommand;privateCommandexitCommand;publicTestCommandListener()display=Display.getDisplay(this);textBox=newTextBox(CommandListener接口,測試CommandListener接口,50,0);openC

30、ommand=newCommand(打開,Command.SCREEN,l);editCommand=newCommand(編輯,Command.SCREEN,1);saveCommand=newCommand(保存,Command.SCREEN,1);undoCommand=newCommand(撤銷,Command.SCREEN,1);exitCommand=newCommand(退出,Command.SCREEN,1);textBox.addCommand(openCommand);textBox.addCommand(editCommand);textBox.addCommand(sa

31、veCommand);textBox.addCommand(undoCommand);textBox.addCommand(exitCommand);publicvoidstartApp()textBox.setCommandListener(this);display.setCurrent(textBox);publicvoidpauseApp()publicvoiddestroyApp(booleanuncondition)publicvoidcommandAction(Commandc,Displayables)if(c=openCommand)textBox.setString(打開命令被執(zhí)行);if(c=editCommand)textBox.

溫馨提示

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

評論

0/150

提交評論