一、序言
手持設備的用戶接口編程不同於桌面微機編程。例如,手持設備的顯示尺寸要小,顯示設備並不總是包括點擊工具如鼠標和筆。由於這些原因,在手持設備的GUI編程時,我們不可能遵循與台式微機編程GUI同樣的規則。
CLDC本身並沒有定義任何的GUI功能。代之的是,J2ME的官方GUI類用象MIDP這樣的輪廓文件所描述,並由JAVA社團組織定義。你可能注意到在MIDP中描述的GUI類不是基於AWT的,這似乎存在很大問題。請往下看。
二、為什麼不重用AWT?
經過相當的考慮之後,MIDP專家組決定不再重用已有的AWT和Swing類。原因如下:
·AWT是為桌面微機開發的,並為這種情形作了優化處理。
·AWT設定了某些用戶交互模式。AWT的組成當中考慮到了如鼠標等的點指設備,但是許多手持設備,如手機等,只有鍵盤用於輸入。
·AWT具豐富的特性,包括在手持設備上還不能實現的。例如,AWT為窗口管理提供廣泛支持,如窗口大小與重疊調用。然而,有限的手持設備的顯示空間,使得它上面的窗口調整根本不可能實現。所以,手持設備是用不到AWT的窗口布局管理器的。
·當用戶與基於AWT的應用程序交互時,甚至對象是動態創建的。這些對象僅在與之相關的事件被應用程序或系統處理時--此時,這些對象對於垃圾回收器來說是有效的--這些對象才存在。但是手持設備有限的CPU和內存無法承擔如此重任。
三、MIDP GUI API
基於以上原因,MIDP創建了它自己的簡短的GUI,其與AWT存在相當的不同。MIDP GUI包含了低級的和高級的API兩類,這兩類AIP各有自己的事件集。本文將討論並演示通過這兩類API來使用對象的例子。通過API操縱事件在下一章中介紹。
高級的API主要應用在移動設備開發特別注重移植性的情況下。為了保證可移植性,API進行了高級抽象,因此給予用戶在控件的外觀和感覺上極少的控制。例如,你沒法定義一個高級組件的可視化外觀(形狀,顏色或者字體)。大多數與組件的交互由系統實現體所封裝;應用程序不必在乎它們。因此,底層的實現上為適應於硬件和本機用戶接口風格作了必要的調整。實現了高層API的類全部繼承自javax.microedition.lcdui.Screen類。
而低層API作了很少的抽象處理。該設計用於要求對圖形元素進行精確控制的場所,這時應用程序還可以對低層輸入事件進行存取。這一類API使得應用程序可以對在屏幕上顯示的內容進行精確的控制。javax.microedition.lcdui.Canvas和javax.microedition.lcdui.Graphics類實現該低層API。但是,應該明確指出,無法保證存取低層API的MIDlets程序是可移植的,因為這種API提供了存取特定設備的細節操作。
1、MIDP GUI模型
下面是MIDP GUI在內核上如何工作的一個模型。為在某MIDP設備上進行顯示,你需要取得該設備的display,這是由javax.microedition.lcdui.Display類來描述的。類Display是唯一的顯示管理器,當用於每一個活動的MIDlet時被實例化,並提供方法以檢索有關該設備顯示能力的信息。
獲取設備的顯示信息是很容易的。但是,對象本身並不令人感興趣。而更令人感興趣的抽象是screen,它封裝和組織圖形對象並協調通過設備的用戶輸入。Screen由javax.microedition.lcdui.Screen對象來描述並由Display 對象調用setCurrent( )方法顯示。一個應用程序中可有多個screen,但是在某一時刻只有一個screen在屏幕上是可見的(當前的這一個),用戶只能遍歷在這一個screen上的項。圖1顯示了在display與它的可能的多個screen之間的一對多的關系。
圖1.display與screens間的關系
在MIDP GUI中共有三種類型的screen:
·完全封裝了復雜用戶接口組件(如List:下圖2或者TextBox:下圖3)的screen。這些screen的結構是預定義好的,應用程序不能把其它組件添加到這些screen上。
圖2.一組互斥的選擇項
圖3.一個文本框的例子
·使用表單組件的普通screen。應用程序可以把文本框,圖像及一些簡單的相關聯的UI組件到表單上,此時表單起容器作用。
·在低層API使用的screen,如一個Canvas或者Graphics對象的子類。
2、Lcdui包
所有的MIDP GUI類都包含在包javax.microedition.lcdui中。該包包含了3個接口和21個類,詳見表1和表2。
表 1: lcdui接口
接口描述Choice為用戶接口組件定義一個API,該API實現從預定義的選項中的選擇CommandListener 用於應用程序檢索來自實現過程的高層次事件ItemStateListener 當應用程序需要接收事件(該事件代表了交互項中的內部狀態中的變化)時使用
表 2: lcdui類
類 描述Alert一個screen,它顯示數據給用戶,並在顯示下一屏前等待一段時間AlertType 該類指出上面Alert的類型Canvas 這是一個需要進行低層事件處理並為屏幕顯示發出圖形調用的應用程序的基礎類ChoiceGroup 為了放置在表單中的一組可選擇的元素Command用來封裝某動作的語義信息DateField 一個可編輯組件,用於描述顯示在表單上的日歷上的日期和時間信息Display用於描述顯示管理器和系統的輸入設備Displayable可被顯示的對象Font 描述字體及其大小的類Form一個screen,其中包含了許多項(圖像,文本,文本域,選項組,等)的任意組合Gauge 完成在表單上某個值的條碼圖顯示Graphics該類提供簡單的二維幾何體著色能力Image存放圖像數據的類ImageItem當把圖像對象添加到form 或者alert上時,負責其布局控制。Item 它是一個可以添加到Form 或者Alert上的所有組件的基類。List 包含一系列選擇的屏幕控件Screen所用高層用戶接口類的基類StringItem 該項可以存放字符串TextBox允許用戶輸入和編輯文本的屏幕控件TextField可以放到表單上去的可編輯文本控件Ticker一種橫跨屏幕顯示的斷續器類型的文本,它可以被依附到除Canvas外的所有screen上。
下圖顯示其中的主要類及其之間的關系。
圖 4.包中的主要類之間的類關系圖