WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堝姛缂佺娀绠栭弻宥堫檨闁告挻姘ㄩ幑銏犫槈濞嗘劕顎撻梺鍛婂姇瀵爼骞栭幇顔炬/闁告挆鍕畬闂佸疇顫夐崹鍧楀箖閳哄啠鍋撻崷顓炐㈡い銉︾箞濮婂搫效閸パ€鍋撳Δ鍛;闁规崘顕ф闂佸憡娲﹂崹鎵不濞戙垺鐓曟い鎰剁稻缁€鍐┿亜鎼达紕效婵﹨娅g划娆忊枎閹冨闂備礁鎽滄慨鐢稿礉濞嗘劒绻嗛柣銏⑶圭粈瀣亜閺嶃劏澹橀柛鐐姂濮婃椽妫冨ù銈嗙⊕閹峰懘骞撻幒宥咁棜闂備礁婀遍崕銈夈€冮崱娑樼厱闁圭儤顨嗛悡鏇㈡煛閸ャ儱濡煎ù婊勭矋閵囧嫯绠涢敐鍛睄闂佸搫澶囬埀顒€纾弳鍡涙倵閿濆骸澧伴柡鍡欏█閺屟勫濞嗘垵鍩岄梺闈涙鐢帡锝炲┑瀣亗閹艰揪绲奸悽鑽ょ磽娴h娈曢柛銊ョ仢椤繒绱掑Ο璇差€撶紓浣圭☉椤戝懎鈻撻鐐╂斀妞ゆ梹鏋婚崗顒傜磼閻樿櫕宕岄柕鍡曠椤繈骞囨担鍏夋瀸濠电姷鏁告慨顓㈠磻閹捐秮褰掓晲閸モ斂鈧﹪鏌¢埀顒佺鐎n偆鍘藉┑鈽嗗灡椤戞瑩宕电€n兘鍋撶憴鍕仩闁稿氦绮鹃悘鍐⒑缂佹◤顏勵嚕閸洖鐤柣鎰暩绾惧ジ鏌涚仦鐐殤閺佸牓鎮楃憴鍕缂侇喖绻樿棟閻庨潧鎽滃Λ顖炴煙椤栧棔绀佹禒顕€鎮楀▓鍨灈闁绘牜鍘ч悾鐑芥偂鎼存ɑ顫嶅┑鈽嗗灟鐠€锕傛倵瀹曞洨纾介柛灞剧懅閸斿秵銇勯妸銉︻棞闁伙絾绻堥獮鏍ㄦ媴濮濆本鎲伴梻浣虹帛濡啴藟閹捐姹查悗锝庡枟閻撶喐淇婇妶鍌氫壕闂佺粯顨呭Λ妤呭煝閹炬緞鏃堝川椤旇瀚奸梺鑽ゅТ濞茬娀鍩€椤掑啯鐝柣蹇婂亾闂傚倷绀侀幖顐﹀箠閹邦厽鍙忛柟缁㈠枟閸嬧晠鏌i妶搴$仜濞存粌缍婇弻鐔兼倻濡偐鐣洪梺鍝勬噺缁诲牆顫忓ú顏咁棃婵炴垶鑹鹃。鍝勨攽閳藉棗浜濋柣鐔叉櫊閵嗕礁鈻庨幒鏃傛澑闂佸搫鍟崐濠氭儊閸儲鈷戞慨鐟版搐閻忓弶绻涙担鍐插椤╃兘鏌ㄩ弴鐐测偓褰掓偂閺囥垺鐓忓┑鐐茬仢閸斻倝鏌涢埡瀣ɑ妞ゃ劊鍎甸幃娆撳级閹存繍娼氭俊銈囧Х閸嬬偤鏁冮姀銈冣偓浣糕枎閹炬潙娈愰梺鍐叉惈椤戝洭鐛姀銈嗏拻闁稿本鐟︾粊鐗堛亜椤愩埄妲搁柣锝呭槻铻i柤娴嬫櫇閻撳顪冮妶鍡橆梿闁跨喆鍎茬粋宥堛亹閹烘挾鍘甸梺缁樺灦钃遍悘蹇e幖闇夋繝濠傚暟缁夌儤鎱ㄦ繝鍛仩缂佽鲸甯掕灒闁惧繘鈧稒顢橀梻鍌欑劍鐎笛兠哄澶婄柧婵炴垶绮庢禍閬嶆⒒娴e憡鍟炴繛璇х畵瀹曞綊鏌嗗鍛幈闂佺鎻梽鍕偂濞嗘挻鐓犳繛鏉戭儐濞呭懎霉閻樺磭鐭婇柍瑙勫灴閸ㄩ箖鎮欓挊澶夊垝闂備浇顕栭崰妤呫€冮崨鏉戠叀濠㈣埖鍔曠粻鎶芥煙閹屽殶鐟滄澘娲ㄧ槐鎾诲磼濞嗘垼绐楅梺鍝ュУ閻楃娀銆侀弽顓炲窛闁圭⒈鍘介弲锝夋⒑缁嬭法绠抽柛妯犲懏顐介柣鎰節缁诲棙銇勯弽銊х煂閻㈩垱绋掔换娑㈠川椤撶喎鏋犲┑顔硷功缁垶骞忛崨瀛樺仭闂侇叏绠戝▓婵堢磽閸屾瑦绁版い鏇嗗洤纾归柛顭戝櫘閸ゆ洜绱撴担璐細缂佲檧鍋撻梻浣规偠閸庮垶宕濆鍛瀺闁搞儺鍓氶埛鎴犵磼鐎n偄顕滄繝鈧幍顔剧<閻庯綆鍋呭畷宀€鈧娲忛崹浠嬪箖娴犲宸濆┑鐘插楠炴姊洪悷鏉挎倯闁伙綆浜畷瑙勭節濮橆剛鍘愰梺鍝勬储閸ㄦ椽鎮¢妷锔藉弿婵☆垰鐏濋悡鎰版煟閹捐泛鏋涢柣鎿冨亰瀹曞爼濡烽妷銉バ戠紓鍌欑椤戝牆鐣烽悽鍨潟闁圭儤姊荤壕鍏间繆椤栨繂浜归柣锝堟缁辨挻鎷呴搹鐟扮缂備浇顕ч悧鍡涙偩瀹勯偊娼ㄩ柍褜鍓氭穱濠傤潰瀹€濠冃ㄧ紓鍌欐祰妞村摜鎹㈤崼婵愭綎缂備焦蓱婵绱掑☉姗嗗剰婵炲牊鍔欏娲箹閻愭彃顬嗛梺鍛婎殔閸熷潡鎮鹃悜绛嬫晬闁绘劘灏欐鍥⒑閻熼偊鍤熷┑顕€娼ч埢鎾淬偅閸愨斁鎷虹紓鍌欑劍钃遍柍閿嬪浮閺屽秴鐣¢幍顔尖叺閻庢鍣崑濠傜暦閹烘鍊烽悗鐢登归獮鍫ユ⒒娴g懓鈻曢柡渚囧櫍瀹曟垿骞樼紒妯煎幐闂佸憡渚楅崰姘跺箠閸涱喕绻嗛柛娆忣槸婵洭鎽堕敐澶嬪仩婵炴垶甯掓晶鏌ユ煛閸屾浜鹃梻鍌氬€烽懗鍓佸垝椤栫偛绀夐柡鍥╁€i悢鍝ョ瘈闁搞儜鍐╁劒闂備胶绮弻銊╂儍濠靛缁╅柤鎭掑劘娴滄粓鏌¢崘銊﹀妞ゃ儱顦甸弻娑㈠棘鐠囨祴鍋撳┑瀣闁割偅娲橀崐鐑芥煟閹寸偍缂氶柛姗€浜跺娲传閸曨剙鍋嶉梺鍛婃煥閺堫剟寮查崼鏇ㄦ晬闁绘劕顕崢鍗炩攽閻愬弶顥滅紒缁樺笧缁粯绻濆顓犲幐闁诲繒鍋熼弲顐f櫏闁诲氦顫夊ú锕傚磻婵犲倻鏆﹂柣鏃傗拡閺佸棝鏌嶈閸撴瑩鍩㈠澶嬫櫜闁搞儮鏅濋敍婵囩箾鏉堝墽绋荤憸鏉垮暞缁傚秹鎮欓鍌滅槇闂侀潧楠忕徊鍓ф兜閻愵兙浜滈柟瀛樼箖瀹告繄绱掗鍓у笡闁靛牞缍佸畷姗€鍩¢崘銊ョ闂備浇顕х€涒晝绮欓幒鎴犲箵閻犳亽鍔庢稉宥嗘叏濡炶浜鹃梺鍝勮閸斿矂鍩ユ径濞㈢喐寰勯惂鍝ョɑ闁靛洤瀚版俊鎼佹晲閸涱厼袝闂備浇顕栭崰妤呮偡閳哄懌鈧線寮崼婵堫槹濡炪倖鎸荤换鍕矆閸曨垱鈷掗柛灞剧懄缁佺増銇勯弴鐔哄⒌鐎规洑鍗冲浠嬵敃閵堝浂妲稿┑鐘垫暩婵挳宕愭繝姘辈闁挎洖鍊归悡娆愩亜閺嶎偄浠滃ù婊呭娣囧﹪鎳犳0婵嗘闂佸疇顫夐崹鍧楀春閸曨垰绀冮柕濞у懌鍋″┑锛勫亼閸娿倝宕㈡ィ鍐ㄧ婵☆垯璀﹂崵鏇㈡偣閸ャ劎銈存俊鎻掔墦閺屾洝绠涢弴鐑嗘綌闂佸啿鎼幊蹇涙偂韫囨搩鐔嗛悹楦挎婢ф洟鏌涢弮鈧幐鎶藉蓟濞戙垹妫樻繛鍡欏亾妤旂紓鍌欐祰妞存悂骞愭繝姘闁告侗鍨抽惌娆撳箹鐎涙ɑ灏ù婊堢畺閺屾稑鈹戦崟顐㈠Б闂佹椿鍘介幐楣冨箟閹间焦鍋嬮柛顐g箘閻熴劑姊洪崫鍕靛剮缂佽埖宀稿濠氭偄閻撳海顦悷婊冪箳閺侇喖鈽夐姀锛勫幐闂佸憡渚楅崰妤呭磹閹扮増鐓涢悘鐐额嚙婵倿鏌熼鍝勨偓婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛濠傛健閺屻劑寮崼鐔告闂佺ǹ顑嗛幐鍓у垝椤撶偐妲堟俊顖氭惈缁犺鈹戦悙鍙夆枙濞存粍绮撻幃鈥斥槈閵忥紕鍘卞┑鐐村灥瀹曨剟鐛Ο姹囦簻闁哄倹瀵чˉ銏℃叏婵犲懏顏犻柟鐟板婵℃悂濡烽敂鎯х稈闂傚倷鑳堕幊鎾诲吹閺嶎厼绠柨鐕傛嫹
开发学院软件开发Java 基于MIDP1.0实现通信录 阅读

基于MIDP1.0实现通信录

 2007-12-23 12:36:42 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑娑⑺囬悽绋挎瀬闁瑰墽绮崑鎰版煙缂佹ê绗ч柍褜鍓﹂崣鍐潖閸濆嫅褔宕惰娴犲ジ姊虹拠鑼闁煎綊绠栭幃楣冩倻閽樺鎽曢梺闈涱檧婵″洭宕㈤悽鍛娾拺閻熸瑥瀚烽崯蹇涙煕閻樺磭澧甸柕鍡楀€圭缓浠嬪川婵犲嫬骞堥梺纭呭閹活亞妲愰弴鐔哄ⅰ闂傚倷绶氬ḿ褍煤閵堝洠鍋撳顐㈠祮闁绘侗鍣i獮鎺懳旈埀顒傜不閿濆棛绡€闂傚牊绋戦弳娆徝瑰⿰鍫㈢暫闁哄矉缍佹慨鈧柍鎯版硾濠€杈ㄧ珶閺囩喓绡€婵﹩鍘鹃崢鐢告⒑缂佹ê濮﹂柛鎾村哺閹ɑ娼忛妸銈囩畾闂佸湱绮敮鐐存櫠濞戞氨纾肩紓浣贯缚濞插鈧娲栧畷顒冪亙闂佸憡鍔曢崯鐘诲礈濠靛牊宕叉繛鎴炨缚閺嗗棗鈹戦悩杈厡闁轰焦鐗滅槐鎾存媴娴犲鎽甸梺鍦嚀濞层倝鎮鹃悜钘夌闁规惌鍘介崓鐢告⒑閻熸澘鎮侀柣鎺炵畵閹骞栨担鍏夋嫽婵炶揪绲块崕銈夊吹閳ь剟姊洪幖鐐测偓鏍偋閻樿崵宓侀煫鍥ㄧ⊕閺呮悂鏌ㄩ悤鍌涘濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻戦妵鍕箻閸楃偟浠肩紓浣哄閸ㄥ爼寮诲☉銏犵疀闂傚牊绋掗悘鍫ユ倵閻熺増鍟炵紒璇插暣婵$敻宕熼姘鳖啋闁诲酣娼ч幗婊堟偩婵傚憡鈷戠痪顓炴媼濞兼劖绻涢懠顒€鏋庢い顐㈢箳缁辨帒螣閼测晜鍤岄梻渚€鈧偛鑻晶顔肩暆閿濆牆鍔垫い锔界叀閹繝濡舵径瀣帾闂佸壊鍋呯换鍐磻椤忓懐绠剧€瑰壊鍠曠花濠氬箚閻斿吋鈷戦悗鍦У閵嗗啴鏌ら崘鑼煟鐎规洘绻堥弫鍐焵椤掑嫧鈧棃宕橀鍢壯囨煕閳╁喚娈橀柣鐔稿姍濮婃椽鎮℃惔鈩冩瘣闂佺粯鐗曢妶绋跨暦閻戞ḿ绡€闁搞儜鍐ㄧギ闂備線娼ф蹇曟閺囥垹鍌ㄦい蹇撶墛閳锋垿鏌熼懖鈺佷粶闁告梹顨婇弻锟犲川椤旈敮濮囩紓浣稿€圭敮鐔妓囩€靛摜纾奸弶鍫涘妼缁楁碍绻涢悡搴g闁糕斁鍓濋幏鍛存煥鐎e灚缍楅梻鍌氬€峰ù鍥ь浖閵娾晜鍊块柨鏇炲€哥粻鏌ユ煕閵夘喖澧柡瀣╃窔閺岀喖宕滆鐢盯鏌¢崨顔藉€愰柡灞诲姂閹倝宕掑☉姗嗕紦闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛銈呭閺屻倝宕妷锔芥瘎婵炲濮靛銊ф閹捐纾兼繛鍡樺笒閸橈紕绱撴笟鍥ф珮闁搞劌鐖兼俊鎾礃椤旂厧绐涢梺鍝勵槹閸ㄥ綊宕㈠ú顏呭€垫鐐茬仢閸旀碍銇勯敂璇茬仸鐎规洩绻濋獮搴ㄦ嚍閵壯冨妇闂傚⿴鍋勫ú锕€煤閺嶃劎澧¢梻鍌欐祰椤曆呪偓鍨浮瀹曟粓鎮㈡總澶嬬稁闂佹儳绻愬﹢杈╁閸忛棿绻嗘い鏍ㄧ閹牊銇勯銏㈢劯婵﹨娅i幏鐘绘嚑椤掑偆鍞规繝娈垮枟鑿ч柛鏃€鍨垮畷娲焵椤掍降浜滈柟鍝勭Ф椤︼箓鏌涢妶搴″⒋闁哄本鐩獮妯兼崉閻戞ḿ鈧顪冮妶搴′簻缂佺粯鍔楅崣鍛渻閵堝懐绠伴悗姘煎墴閹顢橀悜鍡樺瘜闂侀潧鐗嗗Λ娆戠矆閳ь剟姊洪悷鏉挎毐闂佸府绲介悾宄扳堪閸曨偒鍤ら柣搴㈢⊕鑿ら柟閿嬫そ濮婄粯绗熼崶褌绨介梺绋款儐閻╊垶骞婇悢纰辨晬婵炴垶鐟﹂悵宄邦渻閵堝棙鐓ュ褏鏅竟鏇㈡偂鎼搭喚鍞甸柣鐘烘鐏忋劑宕濋悢铏圭<濠㈣泛瀛╅鐘绘煃瑜滈崜姘额敊閺嶎厼绐楅柡宥庡幐閳ь剨绠撻弻銊р偓锝傛櫇缁犳艾鈹戦鐣岀畵闁活厼鐗嗗嵄闁绘垼濮ら埛鎴犵磼鐎n偒鍎ラ柛搴㈠姍閺岀喖鎮烽悧鍫熸倷闁捐崵鍋ら弻娑㈠箛閳轰礁唯濠碘剝褰冮悧濠勬崲濞戙垹骞㈡俊銈呭暟椤斿鈹戦悙鑼闁挎洏鍨归~蹇曠磼濡顎撴俊鐐差儏缁ㄨ偐鎲伴崱娆戠=闁稿本姘ㄨⅵ闂佺ǹ顑嗛幐鑽ゆ崲濞戞埃鍋撳☉娆嬬細闁活厹鍊濋弻娑㈠箻鐠虹儤鐏堥悗瑙勬礃濡炰粙宕洪埀顒併亜閹哄秹妾峰ù婊勭矒閺岀喖鎮滃Ο铏逛淮闂侀€炲苯澧紓宥咃工椤曪綁骞庣粵瀣櫌闂佸憡娲﹂崜娑㈠储闁秵鐓熼幖鎼灣缁夐潧霉濠婂懎鍘撮柣鎿冨墴椤㈡宕掑Δ鈧禍楣冩偡濞嗗繐顏痪鎯ь煼閺屾稑螖閳ь剟宕崸妤婃晪闁挎繂顦壕褰掓煟閺囨氨鍔嶉棄瀣⒒閸屾瑧顦﹂柟纰卞亜铻為悗闈涙憸娑撳秹鏌熼幑鎰靛殭闁藉啰鍠栭弻鏇熺箾閻愵剚鐝曢梺绋款儏濡繈寮诲☉姘勃闁告挆鈧Σ鍫濐渻閵堝懘鐛滈柟鍑ゆ嫹
核心提示: 项目简介 基于MIDP1.0实现的个人通信录是我在学习MIDP子系统Record Management System的时候自己编写的应用程序,整个应用程序涉及到MIDP的高级和低级API、应用MVC实现界面导航、RMS的高级应用、多线程等知识,基于MIDP1.0实现通信录,是学习J2ME开发不错的范例,由于本
   项目简介 
   基于MIDP1.0实现的个人通信录是我在学习MIDP子系统Record Management System的时候自己编写的应用程序,整个应用程序涉及到MIDP的高级和低级API、应用MVC实现界面导航、RMS的高级应用、多线程等知识。是学习J2ME开发不错的范例。由于本站有较多的文章介绍RMS,因此本文对开发中的部分问题进行了介绍。如果您有兴趣,可以直接下载源文件研究代码。如果提供下载请注明作者和出处
 
   作者简介:
   詹建飞(mingjava),北京邮电大学信息工程学院信号与信息处理专业研究生。
   电子信箱:eric.zhan@263.net

   本文将向大家讲述如何给予MIDP1.0实现手机通信录,读者需要具备J2ME的基本知识,了解它的构架和主要内容。开发工具选择了eclipse+wtk2.1+j2sdk1.4.2+eclipseME。

  • 关于开发环境请参考搭建J2ME开发环境
  • 关于J2ME的体系结构请参考J2ME平台的体系结构
      
  • 精通MIDP用户界面设计
          个人通信录提供了添加记录、浏览记录、删除记录、删除电话本、查找记录等功能。图4是几个主要界面的截图。细心的读者可能发现这里没有提供编辑的功能,读者可以免费得到个人通信录的源代码,这样您可以尝试添加这项功能。多读代码、多写代码是提高水平、掌握知识最快捷的途径。
    基于MIDP1.0实现通信录(图一)

在MIDP1.0中的javax.microedition.lcdui包内定义了21个类和3个接口,这比J2SE中的AWT和SWING要简单很多。在这24个类中,Display是负责设备的显示以及输入的管理器,通常我们通过调用setCurrent(Displayable displayable)方法来把displayable组件显示在手机屏幕上。Displayable代表了能够在屏幕上显示的组件对象,它的两个抽象子类是Canvas和Screen,他们分别代表了MIDP中的低级用户界面和高级用户界面。

Form,Alert,List和TextBox都是从Screen继承过来的,他们构成了MIDP中的高级用户界面。要清楚他们每个组件都必须单独占用一个屏幕,不能与其他组件放在一起。Form类在javax.microedition.lcdui包中至关重要,它是Item的容器,通过调用append(Item item)方法,你可以把TextField、DateField等Item放在Form内。例如下面的代码:
public NewPhoneUI(UIController uicontroller)
    {
     super(Title.add_record);
     this.uicontroller = uicontroller;
     nameField = new TextField(Title.name, null, 25, TextField.ANY);
     mobileField = new TextField(Title.mobile, null, 25,
         TextField.PHONENUMBER);
     choice = new ChoiceGroup(null, ChoiceGroup.MULTIPLE);
     phoneField=new   TextField(Title.phone,null,25,TextField.PHONENUMBER);
     emailField=new
TextField(Title.email, null, 25, TextField.EMAILADDR);
     choice.append(Title.detail, null);
     this.append(nameField);
     this.append(mobileField);
     this.append(choice);
     this.addCommand(saveCommand);
     this.addCommand(backCommand);
     this.setCommandListener(this);
     this.setItemStateListener(this);
   }
  Canvas类代表了MIDP的低级用户界面,它是一个抽象类。你需要继承Canvas并实现它的抽象方法paint(Graphics g)来构建你自己的Canvas实例。Paint()方法中的参数g非常重要。因为通过它提供的方法你才能在屏幕上绘画你的界面。如果有时间您应该多多研究一下Canvas类和Graphics类。在个人通信录中我们提供了一个WaitCanvas类并通过它构建了Dialog组件。从下面的代码中您能学会如何使用Canvas类。
package com.north.phonebook.ui;
import java.util.*;
import javax.microedition.lcdui.*;


public class WaitCanvas extends Canvas
{

   PRivate int mCount, mMaximum;
   private int mInterval;

   private int mWidth, mHeight, mX, mY, mRadius;
   private String mMessage;
   private boolean run = false;

   public WaitCanvas(String message, boolean run)
   {
     this.mMessage = message;
     mCount = 0;
     mMaximum = 36;
     mInterval = 100;

   mWidth = getWidth();
     mHeight = getHeight();

   // Calculate the radius.
     int halfWidth = (mWidth - mRadius) / 2;
     int halfHeight = (mHeight - mRadius) / 2;
     mRadius = Math.min(halfWidth, halfHeight);

   //  Calculate the location.
     mX = halfWidth - mRadius / 2;
     mY = halfHeight - mRadius / 2;

   //  Create a Timer to update the display.
     if (run)
     {
       TimerTask task = new TimerTask()
       {
         public void run()
         {
           mCount = (mCount + 1) % mMaximum;
           repaint();
         }
       };
       Timer timer = new Timer();
       timer.schedule(task, 0, mInterval);
     }
   }

 
   public void setMMessage(String message)
   {
     mMessage = message;
   }
   public void paint(Graphics g)
   {
     int theta = -(mCount * 360 / mMaximum);


     g.setColor(255, 255, 255);
     g.fillRect(0, 0, mWidth, mHeight);
     g.setColor(128, 128, 255);
     g.drawArc(mX, mY, mRadius, mRadius, 0, 360);
     g.fillArc(mX, mY, mRadius, mRadius, theta + 90, 90);
     g.fillArc(mX, mY, mRadius, mRadius, theta + 270, 90);

   if (mMessage != null)
     {
       g.drawString(mMessage,mWidth/2,mHeight,Graphics.BOTTOM
           Graphics.HCENTER);
     }
   }

}
   下面我们看看MIDP中的事件处理机制,它同样分为高级事件处理和低级事件处理。高级事件处理由Command和Item事件组成。他们分别对应CommandListener和ItemStateListener接口。你可以在Displayable组件上添加Command并实现CommandListener接口。这个接口只定义了一个方法commandAction(Command cmd,Displayable),因此你要实现这个接口告诉应用程序当指定的command按下的时候它应该去执行什么操作,当然你不能忘记了注册Listener。例如:
public void commandAction(Command arg0, Displayable arg1)
   {
     if(arg0 == backCommand)
     {
       uicontroller.handleEvent
(UIController.EventID.EVENT_SEARCHUI_BACK_MAINNUI); 
     }
     else if(arg0 == searchCommand)
     {
       String userName = inputField.getString();
       if(userName.length()!= 0)
       {
         uicontroller.handleEvent(UIController.EventID.EVENT_SEARCH_RECORD_ANYWAY,new Object[]{userName});
       }
     }

   }
   ItemStateListener定义的方法是itemStateChanged(Item item),它的含义是当指定的item的内容发生变化的时候告诉应用程序去执行相应的操作,例如当TextField中用户输入了姓名,那么应用程序去RMS中去查询相关的记录并返回。例如
public void itemStateChanged(Item item)
   {
     if(item == inputField)
     {
       String userName = inputField.getString();
       if(userName.length()!= 0)
       {
         uicontroller.handleEvent(UIController.EventID.EVENT_SEARCH_RECORD,new Object[]{userName});
       }
     }
   }
   MIDP中的低级事件处理是通过实现Canvas类的相关方法来实现的,例如当用户按下某个按键,应用程序应该去处理相应的操作。由于个人通信录中并未涉及相关内容因此不做讲解。

  • 应用MVC设计模式实现界面导航


   MIDP中的UI类使用起来比不难,然而界面导航问题却并不容易解决,事实上它是困扰很多J2ME程序员的问题。在MIDP中我们只能通过调用Display类中的setCurrent()方法来实现不同界面之间的切换,如果界面多起来比如有8-10个界面的时候就会显得非常的麻烦。你也许想构造一个树形的结构来记录每个界面的父亲界面例如:
public ChildUI(Displayable parent,Dispaly display)
{
 this.parent = parent;
 this.display = display; 
}
   但是当界面以及相互之间的联系增加的时候,界面的导航问题仍然是一个噩梦。MVC设计模式在Web application应用开发方面已经被证明是非常成功的,例如Apache的开源项目struts,在本文中我将讲述如何应用MVC设计模式解决MIDP应用程序的界面导航问题。
   MVC的目的就是实现显示(View)与逻辑(Model)的分离,而在其中起到重要作用的就是控制器(Controller)。在控制器内通常我们要定义一些事件的代号以便和UI类通信,保证正确处理相应的事件,我们可以使用内部类来标记这些事件的代号。
public static class EventID
{
     private EventID()
     {
     }

   public static final byte EVENT_NEW_RECORD_SELECTED = 1;
     public static final byte EVENT_SAVE_RECORD_SELECTED = 2;
     public static final byte EVENT_NEWPHONE_BACK_MAINUI = 3;
     public static final byte EVENT_LISTPHONE_BACK_MAINUI = 4;
     public static final byte EVENT_SEARCHUI_BACK_MAINNUI = 5;
     public static final byte EVENT_CLEAR_RECORD_YES = 6;
     public static final byte EVENT_CLEAR_RECORD_NO = 7;
     public static final byte EVENT_DELETE_RECORD = 8;
     public static final byte EVENT_DELETE_RECORD_YES = 9;
     public static final byte EVENT_DELETE_RECORD_NO = 10;
     public static final byte EVENT_DISPLAY_INFOMATION = 11;
     public static final byte EVENT_DETAIL_BACK_LIST = 12;
     public static final byte EVENT_SEARCH_RECORD = 13;
     public static final byte EVENT_SEARCH_RECORD_ANYWAY = 14;

   public static final byte ADD_NEW_RECORD = 100;
     public static final byte SEARCH_RECORD = 101;
     public static final byte CLEAR_RECORD = 102;
     public static final byte LIST_RECORD = 103;
     public static final byte HELP = 104;
   }


   当UI类中有事件发生的时候它可以向UIController类传输事件的代码,UIController类根据代码来进行相应的事件处理。例如:
if (arg0 == backCommand)
{
  uicontroller.handleEvent(UIController.EventID.EVENT_NEWPHONE_BACK_MAINUI)   
}
UIController的handleEvent()方法则在接收到UI类的请求之后调用Model类的相关方法得到响应,然后再显示相关的界面。
public void handleEvent(int eventID)
   {
     switch (eventID)
     {
       case EventID.ADD_NEW_RECORD:
       {
         newPhoneUI.clear();
         display.setCurrent(newPhoneUI);
         break;
       }


       case EventID.CLEAR_RECORD:
       {
         dialog.setMessage(Title.delete_phonebook);
         dialog.display(EventID.CLEAR_RECORD);
         break;
       }

     case EventID.EVENT_CLEAR_RECORD_YES:
       {
         try
         {
           model.clearAllRecord();
           display.setCurrent(indexFunctionUI);
         } catch (ApplicationException e)
         {
           e.printStackTrace();
         }
         break;
       }
  ……
  ……
}
有的时候我们不光要告诉控制类要做什么还要传输给他一些从界面类采集到的数据,这时候我们可以在UIController类中重载handleEvent()方法,添加一个Object[]类型的参数来接收数据,如下所示:
 
public void handleEvent(int eventID, Object[] obj)
   {
     switch (eventID)
     {
       case EventID.EVENT_SAVE_RECORD_SELECTED:
       {
         try
         {
           Account account = (Account) obj[0];
           if (model.isRecordExist(account.getUserName()))
           {
             showAlert(Title.record_exist, indexFunctionUI,
                 AlertType.WARNING);
           } else
           {
             model.addRecord(account);
            
             showAlert(Title.record_added, indexFunctionUI,
                 AlertType.CONFIRMATION);
           }
         } catch (ApplicationException e)
         {
           e.printStackTrace();
         }
         break;
       }
}
}
例如在添加新电话记录的时候,我们可以这样实现commandAction()方法向UIController传送消息。
if (arg0 == saveCommand)
  {
……
……
      Account newAccount = new Account(userName, mobilePhone, phone,
           email);
       uicontroller.handleEvent(
           UIController.EventID.EVENT_SAVE_RECORD_SELECTED,
           new Object[] { newAccount });
  }
我们很难保证用户输入的数据有效,也很难保证用户的操作都合理,因此我们必须针对用户的不合理的操作给出相对的提示或者警告。在javax.microedition.lcdui包中Alert类能够很好的完成这个任务,因此我们自己提供一个方法如下所示:
   public void showAlert(String message, Displayable next, AlertType type)
   {
     alert = new Alert(Title.alertTitle, message, null, type);
     alert.setTimeout(1500);
     setCurrent(alert, next);
   }
当不合理的事件发生的时候我们应该调用它。
String userName = nameField.getString();
if (userName.length() == 0)
{
  uicontroller.showAlert(Title.userNameNull, this,AlertType.WARNING);
  return;
}
例如当用户并没有输入姓名就按下了保存的按钮的时候,应该提示用户“用户名不能为空”。
基于MIDP1.0实现通信录(图二)


 

   有些时候,某些操作可能会被堵塞,例如联网或者从RMS中读取大量的数据,这个时候我们应该使用多线程,多线程是java语言中内嵌的特性,使用起来也非常简单。在本例中当我们浏览的电话本中包含很多数据的时候,如果不使用多线程,主界面会持续几秒钟不动,这对用户来说很不友好,因为用户不知道现在应用程序在做什么,在这个时候使用多线程就显得非常必要。
基于MIDP1.0实现通信录(图三)

  • 关于RMS子系统的详细介绍请参考本站专题精通MIDP子系统RMS

   本文从介绍J2ME平台,搭建开发环境到最后发布应用程序,详细的介绍了J2ME的开发过程,其中对MIDP的用户界面和Record Management System做了详细、深入的分析。这是本人在进行J2ME开发的一点经验和体会,希望和读者一起分享。由于水平有限,错误在所难免,欢迎大家批评指正

(出处:http://www.cncms.com)


Tags:基于 MIDP 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接