<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    無(wú)為

    無(wú)為則可為,無(wú)為則至深!

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks
    引言

      在上一篇文章介紹了HelloWorld程序的開(kāi)發(fā)過(guò)程,雖然這是一個(gè)經(jīng)典的程序但并不具備任何實(shí)質(zhì)性的功能而且只是在模擬器中仿真運(yùn)行。經(jīng)過(guò)這么長(zhǎng)時(shí)間的學(xué)習(xí),本文中要向讀者在這段時(shí)間的學(xué)習(xí)有所交代,最起碼應(yīng)當(dāng)讓讀者能夠開(kāi)發(fā)出一個(gè)具備簡(jiǎn)單功能的能夠在真機(jī)運(yùn)行的J2ME手機(jī)應(yīng)用程序,也好以此向周?chē)耐瑢W(xué)、同事炫耀一番。相信贏得些許羨慕的目光應(yīng)該不是什么難事。好了,閑話暫且不提,先簡(jiǎn)單介紹一下本文將要介紹的知識(shí)點(diǎn)。

      本文將通過(guò)一個(gè)簡(jiǎn)單的J2ME程序"整蠱專(zhuān)家"的開(kāi)發(fā)向讀者介紹信息框的顯示、命令按鈕的添加、通過(guò)文本框與用戶(hù)的交互、對(duì)命令按鈕的響應(yīng)以及對(duì)所開(kāi)發(fā)應(yīng)用程序的打包發(fā)布等主要內(nèi)容。最終展現(xiàn)給讀者的將是一個(gè)能夠在真機(jī)運(yùn)行的J2ME手機(jī)程序。

      程序的設(shè)計(jì)

      首先,按照上一篇文章介紹的知識(shí)創(chuàng)建J2ME項(xiàng)目Test并添加MIDlet到其中。現(xiàn)在就在EclipseMe生成的框架代碼基礎(chǔ)上將下面陰影顯示的功能代碼添加到相應(yīng)位置:

    package demo;
    import javax.microedition.lcdui.Alert;
    import javax.microedition.lcdui.AlertType;
    import javax.microedition.lcdui.Command;
    import javax.microedition.lcdui.CommandListener;
    import javax.microedition.lcdui.Display;
    import javax.microedition.lcdui.Displayable;
    import javax.microedition.lcdui.TextBox;
    import javax.microedition.midlet.MIDlet;
    import javax.microedition.midlet.MIDletStateChangeException;
    public class Test extends MIDlet implements CommandListener {
     private TextBox textbox; // Textbox 顯示一條消息
     private Display disp; // 引用MIDlet的Display 對(duì)象
     private Command cmdExit; // 設(shè)定按鈕用于退出MIDlet
     private Command cmdOK; // 確定按鈕
     private Alert alt; // 信息提示對(duì)象
     public Test() {
      super();
      disp = Display.getDisplay(this); // 獲得當(dāng)前MIDlet的Display對(duì)象
      cmdExit = new Command("退出", Command.SCREEN, 1); // 新建兩個(gè)控制按鈕
      cmdOK = new Command("閱讀", Command.OK, 1);
      textbox = new TextBox("請(qǐng)輸入待閱項(xiàng)目序號(hào):", "", 40, 0); // 新建文本框
      textbox.addCommand(cmdExit); // 添加控制按鈕
      textbox.addCommand(cmdOK);
      textbox.setCommandListener(this); // 開(kāi)始偵聽(tīng)命令
     }
     protected void startApp() throws MIDletStateChangeException {
      alt = new Alert("整蠱專(zhuān)家 V1.0");// 開(kāi)始運(yùn)行時(shí)顯示版權(quán)信息,新建信息框?qū)ο?
      // 設(shè)置顯示字符串
      alt.setString("==== 整蠱專(zhuān)家 V1.0 ====郎銳2004年作版權(quán)所有(C) 2004-2005");
      alt.setType(AlertType.INFO); // 設(shè)置為普通閱讀信息框
      alt.setTimeout(Alert.FOREVER); // 信息窗口在按下DONE鍵后才能進(jìn)入下一頁(yè)面
      disp.setCurrent(alt, textbox); // 顯示信息窗口
     }
     protected void pauseApp() {}
     protected void destroyApp(boolean arg0){}
     public void commandAction(Command arg0, Displayable arg1)
     {
      if (arg0 == cmdExit) { // 按下退出鍵時(shí)停止運(yùn)行
       destroyApp(false);
       notifyDestroyed();
      }
      if (arg0 == cmdOK) { // 按下閱讀鍵后閱讀對(duì)應(yīng)信息
       TextBox textbox = (TextBox)arg1; // 得到用戶(hù)輸入的內(nèi)容
       String sInfo = textbox.getString();
       if (sInfo.equals("1") || sInfo.equals("2") || sInfo.equals("3") || sInfo.equals("4") || sInfo.equals("5")) { // 顯示項(xiàng)目1的內(nèi)容
        // 根據(jù)所選項(xiàng)目選擇要顯示的內(nèi)容
        if (sInfo.equals("1")) alt.setString("一兄弟脾氣甚……");
        if (sInfo.equals("2")) alt.setString("豬的四大愿望……");
        if (sInfo.equals("3")) alt.setString("春風(fēng)里,百花下……");
        if (sInfo.equals("4")) alt.setString("為什么……");
        if (sInfo.equals("5")) alt.setString("昨夜做了……");
        alt.setTitle("您正在閱讀短信" + sInfo); // 設(shè)置標(biāo)題
       }else{
        alt.setString("很抱歉,暫時(shí)還沒(méi)有您選擇的項(xiàng)目,請(qǐng)重新輸入!");
        alt.setTitle("錯(cuò)誤警告"); // 設(shè)置標(biāo)題
       }
       alt.setType(AlertType.INFO); // 設(shè)置為普通閱讀信息框
       alt.setTimeout(Alert.FOREVER); // 信息窗口在按下DONE鍵后進(jìn)入下一頁(yè)面
       disp.setCurrent(alt, textbox); // 顯示信息窗口
      }
     }
    }

      在講述這段代碼之前首先介紹一下MIDlet的生命周期:一個(gè)MIDlet在其生命周期中共有三種狀態(tài),分別是暫停、活動(dòng)和停止。MIDlet被加載后首先是處于暫停狀態(tài),在J2ME調(diào)用startApp()方法后轉(zhuǎn)入活動(dòng)狀態(tài)。通常情況下應(yīng)用程序是不必考慮如何控制其運(yùn)行狀態(tài)的,其狀態(tài)的切換由手機(jī)來(lái)決定。例如,在程序運(yùn)行過(guò)程中如果有電話呼入則會(huì)自動(dòng)轉(zhuǎn)入暫停狀態(tài)而無(wú)須在與用戶(hù)交互后才能做出判斷。最后,當(dāng)用戶(hù)按下手機(jī)的取消鍵時(shí),MIDlet將進(jìn)入停止?fàn)顟B(tài)。

      在Test類(lèi)的構(gòu)造函數(shù)中首先得到當(dāng)前MIDlet的Display對(duì)象,以便進(jìn)行界面顯示。隨后通過(guò)new操作符新建項(xiàng)目將要用到的命令按鈕、文本框等高級(jí)用戶(hù)界面類(lèi)的對(duì)象。在創(chuàng)建命令按鈕時(shí),可以通過(guò)參數(shù)指定所要?jiǎng)?chuàng)建的命令按鈕種類(lèi)。在TextBox類(lèi)方法addCommand()將其添加到文本框后需要繼續(xù)調(diào)用setCommandListener()方法以開(kāi)始命令的偵聽(tīng),否則創(chuàng)建出來(lái)的命令按鈕僅僅是個(gè)無(wú)法響應(yīng)任何操作的擺設(shè)。由于需要處理按鍵,因此在這里必須實(shí)現(xiàn)CommandListener接口并處理commandAction方法,該方法的具體實(shí)現(xiàn)過(guò)程稍后在進(jìn)行介紹。

      為了在程序開(kāi)始之初啟動(dòng)程序封面,以顯示版權(quán)信息、軟件介紹等簡(jiǎn)介性質(zhì)的文字或畫(huà)面,需要在startApp()方法中添加相應(yīng)的代碼。這里是通過(guò)信息框來(lái)實(shí)現(xiàn)這一功能的。首先新建一Alert對(duì)象,并設(shè)置標(biāo)題、內(nèi)容信息和信息框類(lèi)型。通常我們更習(xí)慣在按鍵之后再進(jìn)入下一頁(yè)面,為了實(shí)現(xiàn)這一效果可以在調(diào)用setTimeout()方法時(shí)指定FOREVER這一屬性參數(shù)。設(shè)置完畢后通過(guò)Display的setCurrent()方法指定該信息框?yàn)楫?dāng)前顯示界面。

      本程序具有用戶(hù)交互功能,用戶(hù)可以通過(guò)輸入要查看短信的序號(hào)來(lái)閱讀不同的短信內(nèi)容。為實(shí)現(xiàn)該功能就要在commandAction()方法中添加代碼進(jìn)行處理。由于本程序添加有兩種不同功能的按鍵,因此首先需要對(duì)第一個(gè)參數(shù)進(jìn)行檢查以區(qū)分當(dāng)前執(zhí)行的是退出命令還是確定命令。如果按下的是后者,再通過(guò)第二個(gè)參數(shù)得到用戶(hù)通過(guò)鍵盤(pán)在文本框錄入的字符并進(jìn)行檢測(cè)判斷,對(duì)于習(xí)慣了C++編程的開(kāi)發(fā)人員需要注意,在判斷字符變量是否與其他字符相等時(shí)不能使用"=="操作符而要使用String的equals()方法進(jìn)行判斷。剩下的工作就是再以信息框?qū)⒂脩?hù)需要的短信顯示出來(lái)即可,具體實(shí)現(xiàn)過(guò)程與前述方法類(lèi)似。


      Eclipse在代碼編寫(xiě)過(guò)程中會(huì)動(dòng)態(tài)檢查錯(cuò)誤,在出現(xiàn)錯(cuò)誤后,可以將鼠標(biāo)移到在出錯(cuò)代碼左側(cè)的錯(cuò)誤圖標(biāo)上雙擊鼠標(biāo),將彈出如上圖所示的更改建議,用戶(hù)可以在其上雙擊鼠標(biāo)接受其建議,在右側(cè)浮動(dòng)窗口顯示的代碼將自動(dòng)添加到適當(dāng)?shù)奈恢谩?BR>運(yùn)行程序并打包

      代碼編寫(xiě)無(wú)誤后可以先在PC上的模擬器中運(yùn)行調(diào)試,并對(duì)出現(xiàn)的問(wèn)題進(jìn)行修改,一切無(wú)誤后再打包發(fā)布。在模擬器的運(yùn)行過(guò)程在上一篇文章已有詳細(xì)介紹,這里就不再重復(fù)。由于程序即將在真機(jī)運(yùn)行,因此最好使用手機(jī)廠商提供的J2ME SDK。下圖為使用SonyErisson J2ME SDK (WTK 1.0.4)和SonyErission_T630模擬器的運(yùn)行過(guò)程截圖:


      在程序列表中選中本程序Test,然后按下Lautch鍵將裝載程序并進(jìn)入軟件首頁(yè)(左2圖),按下Done鍵進(jìn)入用戶(hù)交互界面(左3圖)通過(guò)點(diǎn)擊模擬器的數(shù)字按鍵錄入要查看的短信序號(hào)并按下"閱讀"鍵將顯示相應(yīng)短信內(nèi)容(左4圖)按下Done鍵后返回到前一頁(yè)面,可以再次輸入其他短信序號(hào)繼續(xù)閱讀其他短信的內(nèi)容,直到按下"退出"鍵返回到最開(kāi)始的界面(左1圖)。


      顯然,編寫(xiě)的程序并沒(méi)有什么問(wèn)題,可以向真機(jī)發(fā)布了。在發(fā)布時(shí),首先要確保已經(jīng)添加有對(duì)MIDlet的定義。可以在導(dǎo)航器視圖中雙擊"Test.jad"項(xiàng)打開(kāi)jad編輯器(見(jiàn)上圖)。在編輯器下方窗口切換中選擇Midlets進(jìn)入Midlet定義窗體,確保有如上圖所示的項(xiàng)目出現(xiàn),否則添加之。如果需要添加圖標(biāo)的話,可以指定待使用的圖標(biāo),但一定要預(yù)先將圖標(biāo)文件轉(zhuǎn)換成png格式的文件。




      最后要進(jìn)行的應(yīng)用程序打包處理簡(jiǎn)單的幾乎難以置信,只需右擊項(xiàng)目并選擇上下文菜單的"J2ME"菜單所彈出的"Create Package"菜單項(xiàng)即可(見(jiàn)上圖)。EclipseMe將自動(dòng)在項(xiàng)目存放目錄下的deployed文件夾下生成兩個(gè)文件,分別是Test.jad和Test.jar。只要通過(guò)手機(jī)上傳軟件經(jīng)由數(shù)據(jù)線、紅外口或是藍(lán)牙將Test.jar上傳至手機(jī)即可。當(dāng)然,手機(jī)必須是支持Java的才行。如果不清楚是否支持,可查閱手機(jī)用戶(hù)手冊(cè)。

      小結(jié)

      到此為止,已經(jīng)實(shí)現(xiàn)了一個(gè)真正能夠在手機(jī)運(yùn)行的J2ME程序。雖然最后完成的"整蠱專(zhuān)家"程序功能仍然有限,但是讀者可以發(fā)現(xiàn)我們開(kāi)發(fā)出來(lái)的軟件與下載得到的各種Java手機(jī)程序并沒(méi)有本質(zhì)的差別。通過(guò)對(duì)其開(kāi)發(fā)過(guò)程的剖析可以發(fā)現(xiàn)J2ME程序的開(kāi)發(fā)并沒(méi)有原先想象的那么神秘與高深。只要投入更多的精力和創(chuàng)意,不難寫(xiě)出功能更強(qiáng)大、界面更美觀的J2ME程序。目前做到的是J2ME程序的突破,今后需要做的是不斷的提高。在下一篇文章,也就是本系列文章的最后一篇文章,將在此基礎(chǔ)上實(shí)現(xiàn)一個(gè)圖形化的手機(jī)游戲程序。

    凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
    、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。

    posted on 2006-01-12 16:53 草兒 閱讀(198) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): eclipse
    主站蜘蛛池模板: 午夜性色一区二区三区免费不卡视频| 亚洲综合在线视频| 久久免费线看线看| 国产精品亚洲专区在线观看| 无码国产亚洲日韩国精品视频一区二区三区 | 亚洲av色福利天堂| 国产婷婷高清在线观看免费| 亚洲三级中文字幕| 国产亚洲一区二区三区在线观看| a毛片基地免费全部视频| 久久精品无码免费不卡| 一级毛片a免费播放王色| 国产成人亚洲综合网站不卡| 亚洲白嫩在线观看| 香蕉蕉亚亚洲aav综合| 亚洲欧洲一区二区| 久久亚洲国产精品一区二区| 亚洲欧洲精品无码AV| 亚洲午夜激情视频| 伊人久久大香线蕉亚洲| 免费va在线观看| 亚洲精品第一国产综合精品99| 美女被免费视频网站a国产| 国产hs免费高清在线观看| 四虎永久免费观看| 久久久久亚洲AV成人网| 红杏亚洲影院一区二区三区| 国产成人A人亚洲精品无码| 亚洲成AV人片天堂网无码| 亚洲人成亚洲精品| 亚洲日韩国产精品乱-久| 免费人成动漫在线播放r18 | 18禁止观看免费私人影院| 7723日本高清完整版免费| 成人男女网18免费视频| 国产精品免费视频播放器| 久久精品国产69国产精品亚洲| 4480yy私人影院亚洲| 色噜噜狠狠色综合免费视频| 国产一级片免费看| 国产免费人成在线视频|