国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

探索J2ME:創建開銷細節表單

2019-11-18 12:45:55
字體:
來源:轉載
供稿:網友

  Sun推出的java 2 Micro Edition (J2ME) 可以讓開發人員創建專用于各類手持設備的應用程序,比如傳統的PDA到所謂的智能電話等。為了利用MIDP(Mobile Information Device PRofile:移動信息設備框架)向讀者介紹J2ME的開發知識,我將引領讀者了解和把握一個完整J2ME應用程序的創建過程,這一程序在本系列文章中都被命名為EXPenses。
  在上一篇文章里我向讀者介紹了Expenses采用的主要MIDlet,同時還討論了兩種lcdui用戶界面組件: Command和 List。本文接著介紹用來編輯現有開銷項目或者添加新項目的具體情況,由此令開發人員從此步入Item組件一族的殿堂。
  現在我們就開始編程!首先下載 Expenses的升級源代碼,然后看看新的DetailForm表單,如圖A中的DefaultGrayPhone模擬器所示。
  圖A
  探索J2ME:創建開銷細節表單


  新的細節表單
  首先讓我們查看新表單,然后是Expenses類,最后在應用程序中編寫DetailForm。
  設計新表單
  DetailForm擴展了Form基類(而后者又擴展了Screen,所以該類包含了其他組件)并且實現了commandListener和ItemStateListener接口,同時可以處理自己的事件。假如你已經閱讀過相應的代碼,那么你應該注重到DetailForm的API中有個setDestroyListener方法,該方法接受一個類實例,而這個類實例則實現了可定制的DestroyListener接口。初始化lcdui所采用的事件通知機制就可以通知DetailForm的控制MIDlet (用戶已經完成了該組件,它要用到該表單)。一旦MIDlet收到事件,它就會使用Display.setCurrent 激活其他Screen組件。
  為什么我要不厭其煩地討論事件機制的細節呢?這是因為我想更多地用到DetailForm表單而非僅僅一個MIDlet,當然,最開始還是先讓咱們看看Items。
  查看構造器
  DetailForm的構造器代碼如程序清單A所示。這個構造器以ExpenseInfo的一個實例作為其參數,這樣我就可以處理現有項目的編輯功能,同時還可以在同一代碼的基礎之上創建新項目。DetailForm通過對基類Form構造器的調用設置其名稱,然后創建4個 Item用戶界面組件,它們是一個DateField、兩個TextFields和一個ChoiceGroup,其功能就是顯示ExpenseItem的有關信息,另外還要加上兩個Commands。
  正如我們現在都知道的那樣,Item組件族派生于Item抽象類,同大多數家族成員一樣,這類組件有很多性質是相同的。首先, Items 可以放在Screen對象上。其次,它們共享單一事件itemStateChange,該事件提示組件所表示的數據發生了變化。
  DateField
  DateField和TextField組件的用途從它們的名字就可以看出來。DateField顯示日期,用戶可以由此通過熟悉的日歷界面選擇新的日期。DateFields具有若干種模式,具體設置可以這樣做:傳遞三種靜態DateField常量之一作為構造器的第2個參數。
  DateField.DATE_TIME設置DateField為顯示日期和時間。
  DateField.DATE設置組件顯示和編輯日期(不對時間操作)。
  DateField.TIME只顯示和編輯時間(不對日期操作)。
  因為我們只關心Expenses程序中的日期,所以我創建的dfDateDateField組件具有唯日期屬性,如清單A所示。
  TextFields
  TextField組件顯示文本,同時答應用戶編輯文本,在功能上類同于桌面應用程序中的文本框。TextFields 支持某些基本的輸入限制功能,而且這類功能可以在創建組件的時候由構造器的最后一個參數設置。除了對輸入信息進行限制以外,這些約束條件還可以簡化電話風格鍵盤的數據輸入操作,因為約束只承認給定鍵的某些特定字符(比如,只有數字按鈕上的數字可以輸入)。可能的約束值如下:
  TextField.ANY:任何信息都可以輸入;文本、非凡字符和數值等。
  TextField.EMAILADDR:只有組成有效電子郵件地址的字符才可以輸入。
  TextField.NUMERIC:只能輸入數值。記住,MIDP不支持浮點數值,所以該約束條件只答應輸入整數。
  TextField.PASSWord:和傳統的密碼輸入方式相同,用星號(*)取代用戶輸入的密碼信息。
  TextField.PHONENUMBER:只能輸入組成有效電話號碼的信息。
  TextField.URL:只能輸入合法組成URL的字符。
  fmDetail表單包含了兩個TextFields:其一是tfDesc,它答應輸入事件的文本說明(比如“Lunch”)。其二是tfAmount,它記錄開銷的美元數量,因此通常由TextField.NUMERIC約束創建。
  ChoiceGroup
  細節表單的cgCategory組件是一個ChoiceGroup,用戶可以把開銷放到預先設置的開銷類別里: Meals、Lodging、Car、Entertainment或者Miscellaneous。ChoiceGroups 在功能上等同于List組件,后者我在上一篇文章中已經有所介紹,但是它們只支持EXCLUSIVE和 MULTipLE格式(沒有IMPLICIT ChoiceGrou這類東西)。同樣的,作為Item組件,ChoiceGroups 會在操作事件的時候觸發itemStateChanged事件,而Lists則觸發 commandAction事件。
  給ChoiceGroup添加項目有兩種方法。首先,你可以構造一個空組件然后通過append或者 insert方法加入項目。其次,你還可以傳遞一個包含項目的String數組(這些項目是你希望ChoiceGroup顯示的)給重載的構造器。這兩種方法各有高低,但我在這里采用了第2種方法,主要是為了能讓我對中心位置保存的類別列表(作為靜態數組ExpenseInfo的成員)有一定的選擇能力。這樣就可以很方便地添加新類別或者讓用戶在將來具有這樣做的能力。
  在ChoiceGroup中給每一項指定圖標也是可以的。當然,這里沒必要做了免得程序變得復雜,所以我打算在將來的文章中再討論。
  事件處理
  DetailForm上的Items 都能再用戶操作其數據時觸發itemStateChanged事件。如程序清單 B所示。itemStateChanged的工作方式和commandAction事件相同:它檢查產生事件的Item,確定應該采取的行動。在本文的例子中, DetailForm更新其私有的ExpenseItem實例來匹配用戶修改的數據。
  這里唯一需要具體解釋的是tfAmount變動事件的處理。不支持浮點數字顯然令美元和美分數量的處理變得復雜起來,我也碰到了這樣的難題。有兩種解決辦法:給美元和美分分別提供TextFields 作為數值表示部分,或者總是假定最后兩位數字代表美分。不過這就需要用戶用美分來記錄數值(100代表1美元)。
  當然,DetailForm也處理自身的兩個組件cmOK和cmCancel所觸發的commandAction事件。只要用戶調用了以上兩個組件之一, DetailForm就會調用DestroyListener.requestDestroy。假如用戶調用cmOK,私有的ExpenseInfo實例就會被告之保存對其所進行的修改。
  歸到一塊
  現在只需要修改Expenses MIDlet來利用DetailForm即可。期間需要三個步驟:
  實現Expenses中的DestroyListener以便在用戶通過其兩個組件之一關閉程序時破壞DetailForm并且顯示lsMain。
  修改Expenses.commandAction (程序清單C) 以便用戶在選擇項目時內容將顯示在DetailForm中。
  修改Expenses.commandAction,這樣一旦用戶調用了cmAdd,DetailForm就會被創建并顯示一個新的、空白的ExpenseInfo實例。
  設計問題:為什么要有兩個MIDlets?
  你在看代碼的時候可能注重到了,代碼中有兩個MIDlets,最初的Expenses和新的NewExpense MIDlet。這樣做的原因很簡單:在大多數情況下,Expenses的用戶會打開程序僅僅添加某個新的開銷項目。所以我們的設計反映了兩個基本的移動應用程序設計原則:方便用戶操作,提供最常用功能的快捷方式。
  NewExpense簡單地復制了Expenses中調用cmAdd命令時發生的行為。它創建一個新的、空白的ExpenseInfo實例和一個顯示前者的DetailForm實例。當然,在這個時候,應用程序還沒有受到數據存儲的支持,所以任何通過NewExpense新加入的項目都不會出現在Expenses里。沒關系,后面我們就要說到這一點了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天台县| 沧州市| 东海县| 兰州市| 陆川县| 沅江市| 天津市| 都匀市| 乌什县| 兰溪市| 钟祥市| 凤阳县| 阳春市| 正阳县| 苍南县| 普陀区| 深水埗区| 嘉定区| 谢通门县| 岫岩| 金门县| 盐城市| 涟源市| 七台河市| 乡城县| 新疆| 清新县| 万宁市| 绵阳市| 临湘市| 巴中市| 德阳市| 新邵县| 固始县| 卓资县| 文昌市| 怀化市| 日照市| 兴安县| 惠州市| 南康市|