J2ME就是Java 2 Platform,micro Edition的縮寫(xiě)。J2ME是Java 2的一個(gè)組成部分,與J2
SE、J2EE并稱。根據(jù)Sun Microsystems,Inc.的定義:J2ME是一種高度優(yōu)化的Java運(yùn)行環(huán)境,針
對(duì)市面上的大量消費(fèi)類電子設(shè)備,例如Papers、cellular phones(蜂窩電話), screen-phone
s(可視電話?)、digital set-top boxes(數(shù)字機(jī)頂盒)、car navigation systems(汽車(chē)導(dǎo)航
系統(tǒng))等等。
J2ME技術(shù)在1999年的JavaOne Developer Conference大會(huì)上推出。J2ME技術(shù)將Java語(yǔ)言
的與平臺(tái)無(wú)關(guān)的特性移植到小型電子設(shè)備上,允許移動(dòng)無(wú)線設(shè)備之間共享應(yīng)用程
為了學(xué)習(xí)J2ME技術(shù),我需要安裝什么樣的軟件?
1)、J2ME Wireless Toolkit
J2ME Wireless Toolkit簡(jiǎn)稱J2MEWTK,目前最新的版本就是1.0.3 Beta,J2MEWTK有什么用?打
一個(gè)比方,J2MEWTK之于J2ME程序的開(kāi)發(fā),就相當(dāng)于JDK之于Java程序的開(kāi)發(fā)。J2MEWTK是由Sun
公司開(kāi)發(fā)的,你可以到Sun的網(wǎng)站去下載,這個(gè)工具和JDK一樣,是完全免費(fèi)的。
2)、J2SE SDK 1.3
J2SE SDK 1.3亦即JDK 1.3,JDK有什么用?相信學(xué)過(guò)Java語(yǔ)言的人都知道,我就不多寫(xiě)了,在安
裝J2MEWTK之前,你必須確保你的系統(tǒng)已經(jīng)安裝了一個(gè)可用的JDK。建議不要使用JDK 1.2和JD
K 1.4,前者版本低,后者不穩(wěn)定。
3)、Tomcat 3.2.3/4.0
Tomcat 3.2/4.0用作服務(wù)器軟件,為J2ME手機(jī)提供服務(wù)。由于手機(jī)的資源有限,所以我們需要
盡量將商業(yè)計(jì)算集中于服務(wù)器端完成,減小客戶端的負(fù)擔(dān),所以要開(kāi)發(fā)J2ME程序,一個(gè)服務(wù)器軟
件是少不了的。我采用JSP作為服務(wù)器端的解決技術(shù),所以我選用的Web服務(wù)器是Tomcat。但是
你也可以選用IIS+ASP、Apache+PHP。這個(gè)選擇不是唯一的。
第一步,安裝JDK 1.3.0或者安裝一個(gè)包含JDK 1.3.0的軟件。我安裝了Jbuilder 5.0,它所帶
的JDK是HotSpot 1.3.0_01 Client版。
第二步,安裝J2MEWTK 1.0.3 Beta,在安裝的過(guò)程中,需要選擇系統(tǒng)中JDK的安裝目錄,安裝程序
一般可以自動(dòng)查出來(lái)JDK的安裝目錄,我們不用操心。
第三步,安裝Tomcat 3.2.3/4.0,Tomcat 3.2.3是最穩(wěn)定的3.x系列,推薦使用。Tomcat 4.0剛
剛發(fā)布了正式版,也不妨一試。Tomcat 3.2.3/4.0需要經(jīng)過(guò)配置,才能夠運(yùn)行。
第四步,測(cè)試Tomcat是否能夠正常運(yùn)行JSP程序。這一步很重要。
J2ME開(kāi)發(fā)工具比較:
1)、J2MEWTK,這個(gè)工具在前文已經(jīng)提到過(guò),它是最基本的J2ME程序開(kāi)發(fā)工具,免費(fèi),體積小,速
度較快,完全遵守J2ME的各種規(guī)范。具有簡(jiǎn)單的IDE界面,易于上手,開(kāi)發(fā)十分方便快捷,可以和
Forte 3.0捆綁。J2MEWTK適用于初學(xué)者和已經(jīng)達(dá)到很高水平的開(kāi)發(fā)者。竊以為J2MEWTK+JDK+
Editplus/UltraEdit是絕配。評(píng)語(yǔ):重劍無(wú)鋒,大巧不工。
2)、VisualAge Micro Edition 1.4。這是IBM的產(chǎn)品,號(hào)稱是J2ME開(kāi)發(fā)領(lǐng)域的TOP 1,但是我用
了半天,也沒(méi)有看出好在那里。馬上就刪除了。窗口太復(fù)雜,不明所以,開(kāi)發(fā)起來(lái)很難適應(yīng),速
度和J2MEWTK一樣,比較龐大,裝了這個(gè)東西,你的C盤(pán)就要小心了,多了很多亂七八糟的文件,還
注冊(cè)了許多COM組件,典型的非綠色軟件。評(píng)語(yǔ):!#$#%$#$%$#%@$@#。
3)、CodeWarrior for Java 6.0。這是Motolola的產(chǎn)品,功能十分強(qiáng)大,集成度很好,開(kāi)發(fā),調(diào)
試,發(fā)布J2ME程序都很方便(還可以做一般的Java Program)。它的IDE和Visual Studio十分相
似,很容易上手。CodeWarrior比較適合中等水平的開(kāi)發(fā)者的使用。不過(guò)CodeWarrior不是免費(fèi)
軟件,你只能夠免費(fèi)使用30天。評(píng)語(yǔ):摩托羅拉CodeWarrior,隨時(shí)隨地J2ME。
4)、Borland Jbuilder 5.0的Nokia Bobile版。沒(méi)用過(guò)。評(píng)語(yǔ):缺。
在開(kāi)發(fā)J2ME應(yīng)用程序之前,我們必須選擇這些程序運(yùn)行的平臺(tái),亦即開(kāi)發(fā)出來(lái)的J2ME程序
運(yùn)行在那一種手機(jī)或者是移動(dòng)設(shè)備上面。在開(kāi)發(fā)的過(guò)程中,我們需要對(duì)J2ME應(yīng)用程序進(jìn)行測(cè)試
,當(dāng)然了,自己擁有一款支持J2ME的手機(jī)是最好的,例如Motolola的i85s,但是這個(gè)要求不是每
一個(gè)開(kāi)發(fā)者都能夠滿足(我連手表都沒(méi)有,更不用說(shuō)手機(jī)了),因此,大多數(shù)的J2ME開(kāi)發(fā)環(huán)境都提
供了各種各樣的手機(jī)、移動(dòng)設(shè)備模擬器,你可以首先在手機(jī)模擬器上測(cè)試你的J2ME程序,開(kāi)發(fā)
完畢以后,再將程序交給專業(yè)的廠商(一般是移動(dòng)設(shè)備提供商),由它們將程序載入手機(jī)中進(jìn)行
真實(shí)的程序測(cè)試。模擬器和真實(shí)的設(shè)備之間有一定的差別,但是你的程序只要在模擬器上通過(guò)
了,那么問(wèn)題不會(huì)很大。
J2MEWTK提供六種模擬器,分別是:Default Color Phone、Default Gray Phone、Minimu
m Phone、Motolola i85s、PalmOS Device、RIM Java Handle。這些模擬器雖然外觀不一樣
,操作也不太一樣,但是J2ME程序在其上運(yùn)行的結(jié)果是不會(huì)有什么區(qū)別的,在真實(shí)的設(shè)備上也是
沒(méi)有什么區(qū)別的,這體現(xiàn)了Java的跨平臺(tái)特性。你還可以自定義自己的手機(jī)模擬器,這在J2ME
WTK的User Guide中有詳細(xì)的描述。
在開(kāi)發(fā)過(guò)程中,選擇何種模擬器是十分重要的,原則上來(lái)說(shuō),你為那一種設(shè)備開(kāi)發(fā)程序
,就要使用那一種設(shè)備的模擬器。但是J2ME程序在不同的模擬器上的運(yùn)行效果基本上是一致
,所以你也可以采用你自己喜歡的模擬器。我們推薦你選用RIM Java Handle模擬器作為開(kāi)發(fā)
的首選模擬器,因?yàn)樗钠聊缓艽?看起來(lái)很舒服(但是別忘了你的真實(shí)設(shè)備的屏幕大小)。
在J2MEWTK中,可以設(shè)定缺省的模擬器,怎么設(shè)呢?從開(kāi)始菜單選擇J2MEWTK---->Default
Device Selection,在下拉列表框中選擇模擬器的名字,然后單擊OK按鈕即可,J2MEWTK就會(huì)把
這種模擬器認(rèn)為是缺省的模擬器。你也可以在開(kāi)發(fā)環(huán)境中每次手動(dòng)選擇模擬器,不過(guò)這樣做顯
然比較麻煩。J2MEWTK在初始情況下,默認(rèn)的模擬器是Default Color Phone,說(shuō)實(shí)在話,我從
來(lái)沒(méi)有看見(jiàn)過(guò)這么難看的手機(jī)。
現(xiàn)在開(kāi)始嘗試開(kāi)發(fā)J2ME程序。我的選擇是Windows XP 2600 Professional+J2SE SDK 1.3.
0+Tomcat 4.0+J2MEWTK 1.0.3Beta。從開(kāi)始菜單中選擇J2MEWTK---->Ktoolbar。Ktoolbar是
J2MEWTK提供的一個(gè)簡(jiǎn)陋的IDE工具。
進(jìn)入Ktoolbar以后,觀察窗口,在菜單的下面有四個(gè)按鈕,分別是:
New Project:創(chuàng)建一個(gè)新的項(xiàng)目。
Open Project:打開(kāi)一個(gè)項(xiàng)目。
Setting:對(duì)當(dāng)前項(xiàng)目的環(huán)境進(jìn)行設(shè)置。
Build:編譯項(xiàng)目中的所有Java文件。
Run:啟動(dòng)缺省的模擬器,將當(dāng)前項(xiàng)目載入,運(yùn)行。
Clear Console:清除控制臺(tái)輸出。
在上述按鈕的下面,有一個(gè)下拉列表框,在這里你可以設(shè)置當(dāng)前項(xiàng)目所使用的模擬器,這個(gè)
設(shè)置可以覆蓋缺省的模擬器。在此下拉列表框下面,是一個(gè)文本框,這就是所謂的控制臺(tái)了。
所有編譯、運(yùn)行信息都會(huì)在這個(gè)控制臺(tái)中輸出。你可以使用Clear Console按鈕將控制臺(tái)中的
信息完全清除。
現(xiàn)在來(lái)看看菜單。Ktoolbar的菜單極其簡(jiǎn)單,沒(méi)有什么可說(shuō)的。Project菜單的package菜單
項(xiàng)的作用是將當(dāng)前項(xiàng)目打包輸出。這個(gè)菜單項(xiàng)特別有用,當(dāng)你完成項(xiàng)目開(kāi)發(fā)之后,使用這個(gè)菜
單項(xiàng)可以產(chǎn)生一個(gè)jar文件,這樣就完成的項(xiàng)目的初步發(fā)布。
現(xiàn)在來(lái)創(chuàng)建一個(gè)新的項(xiàng)目,單擊New Project按鈕,或者是使用File菜單的同名菜單項(xiàng)。出現(xiàn)
一個(gè)新窗口。這個(gè)新窗口有兩個(gè)文本框,第一個(gè)文本框是Project Name,輸入fancy。第二個(gè)文
本框是MIDlet Class Name,輸入fancy.test.HelloWorld。然后單擊OK,又出現(xiàn)一個(gè)對(duì)話框,要
你配置項(xiàng)目的環(huán)境,不理,單擊OK按鈕關(guān)閉該窗口,回到Ktoolbar的主窗口。經(jīng)過(guò)上述步驟,你
已經(jīng)創(chuàng)建了一個(gè)名為fancy的J2ME項(xiàng)目。
安裝J2MEWTK以后,你應(yīng)該仔細(xì)瀏覽一下J2MEWTK的目錄結(jié)構(gòu),這是一個(gè)很好的習(xí)慣。J2MEWT
K的目錄結(jié)構(gòu)如下:
appdb文件夾:里面有duke的一些靚照。
apps文件夾:里面有J2MEWTK的一些例子程序,我們建立的項(xiàng)目文件也存放在里面。
bin文件夾:里面全部是exe程序。
docs文件夾:不用多說(shuō)了,是地球人都知道。
lib文件夾:存放MIDP API。
wtklib文件夾:存放J2MEWTK用到的類庫(kù),以及一些資源文件,比如按鈕的圖標(biāo)等等。
在這些文件夾中,apps文件夾特別需要留意,這個(gè)文件夾有下列子文件夾:
example:存放J2MEWTK的例子,側(cè)重于圖形方面,例子比較大,復(fù)雜,難看懂。
lib:空,不知道放什么東西。
tmplib:空,不知道放什么東西。
UIDemo:存放J2MEWTK的例子,側(cè)重于用戶界面設(shè)計(jì)方面。例子不大,難度中等。
fancy:這個(gè)文件夾原來(lái)是沒(méi)有的,當(dāng)我們創(chuàng)建fancy項(xiàng)目的時(shí)候,J2MEWTK自動(dòng)為我們創(chuàng)建的文
件夾。
進(jìn)入fancy文件夾,它里面又有很多子文件夾,如下所示:
bin:存放項(xiàng)目的打包輸出文件。
classes:存放編譯器產(chǎn)生的class文件。
lib:空,不知道有什么用。
res:存放資源文件,例如項(xiàng)目中用到的圖片。
src:存放項(xiàng)目的源代碼。
tmpclasses:存放編譯器產(chǎn)生的class文件,是classes文件夾的鏡像。
tmplib:空,不知道有什么用,是lib文件夾的鏡像。
現(xiàn)在該是使用J2ME說(shuō)Hello World的時(shí)候了。選擇你最喜歡的文本編輯器,例如Editplus,
輸入下面的代碼:
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class HelloWorld extends MIDlet implements CommandListener
{
private Display display;
private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public HelloWorld()
{
display = Display.getDisplay(this);
}
public void startApp()
{
props = new Form("Hello World");
props.append("Hello World!\n");
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}
public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}
public void destroyApp(boolean unconditional)
{
}
public void pauseApp()
{
display.setCurrent(null);
props = null;
}
}
然后將該文件保存在J2MEWTK_HOME\apps\fancy\src\fancy\test目錄下面,文件名為Hello
World.java。注意:你需要在fancy\src目錄下面創(chuàng)建fancy文件夾,然后再在fancy文件夾下面
創(chuàng)建test文件夾。最后才保存HelloWorld.java文件。
現(xiàn)在轉(zhuǎn)到J2MEWTK的主窗口,單擊Build按鈕,編譯整個(gè)項(xiàng)目,查看控制臺(tái)的輸出信息,一切無(wú)
誤,再單擊Run按鈕,運(yùn)行此程序。運(yùn)行效果如下圖所示:
要停電了,只好寫(xiě)道這里了。
1) package fancy.test;
這行代碼聲明當(dāng)前類所在的包。這是有必要的。而且這個(gè)包名必須和src文件夾中的目錄結(jié)
構(gòu)對(duì)應(yīng)。
2)
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
這兩行代碼導(dǎo)入必要的Java包,這兩個(gè)包的作用在后面會(huì)提及,這里就不多說(shuō)了。
3)
public class HelloWorld extends MIDlet implements CommandListener
J2ME程序一般應(yīng)該繼承MIDlet,實(shí)現(xiàn)CommandListener。就如Applet必須繼承Applet,可能實(shí)
現(xiàn)Runnable接口一樣。
4)
private Display display;
private Form props;
定義兩個(gè)私有對(duì)象,Display代表屏幕,顯示區(qū)域。Form是容器的一種。在J2ME程序中,不但
有容器的概念,還有畫(huà)布(Canvas)的概念。這個(gè)程序在Form容器中顯示文本。
5)
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
聲明一個(gè)Command對(duì)象。J2ME的事件處理機(jī)制和J2SE的事件處理機(jī)制不太一樣。在J2ME程序
中,必須預(yù)先定義一些Command對(duì)象,注冊(cè)到程序中。當(dāng)設(shè)備發(fā)生了某個(gè)事件,會(huì)產(chǎn)生相應(yīng)的Co
mmand對(duì)象,并把它傳遞給一個(gè)事件處理函數(shù)----commandAction(),由它對(duì)所產(chǎn)生的事件做統(tǒng)
籌處理。
6)
public HelloWorld()
{
display = Display.getDisplay(this);
}
這個(gè)是構(gòu)造函數(shù),函數(shù)內(nèi)部,調(diào)用Display對(duì)象的靜態(tài)方法---getDisplay(),獲取屏幕對(duì)象,
實(shí)例化display變量。這個(gè)調(diào)用是必要的。你可以在構(gòu)造函數(shù)中做這個(gè)工作,也可以在startA
pp()方法中做這個(gè)工作。推薦在構(gòu)造函數(shù)中完成。
7)MIDlet程序的運(yùn)行流程
構(gòu)造函數(shù)---->startApp()------>偵聽(tīng)事件,接受命令------->commandAction()方法----
--->調(diào)用別的方法----------->如果是exit命令--------->pauseApp()--------->destroyA
pp()方法。實(shí)際上MIDlet程序的運(yùn)行流程和Applet程序的運(yùn)行流程差不多。
8)
public void startApp()
{
props = new Form("Hello World");
props.append("Hello World!\n");
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}
這是startApp()方法。這個(gè)方法是父類的抽象方法,在子類中必須予以覆蓋。首先實(shí)例化F
orm對(duì)象----------props,Form的構(gòu)造函數(shù)的參數(shù)(Hello World)就是屏幕的標(biāo)題。Form對(duì)象
是一容器,在里面可以包含別的東西,props.append(“…..”);的作用就是在這個(gè)容器中存放
一個(gè)字符串。這個(gè)字符串會(huì)在屏幕中顯示出來(lái)。
接下來(lái)的三行代碼分別做這樣的工作:
將Exit命令注冊(cè)到Form對(duì)象(props)中,這樣Form對(duì)象(props)可以對(duì)該命令作出響應(yīng)。
設(shè)置Form對(duì)象(props)的命令監(jiān)聽(tīng)者。
將Form對(duì)象設(shè)置為屏幕顯示的對(duì)象。
你可以試著注釋掉這三行代碼,再編譯運(yùn)行這個(gè)程序,看看會(huì)發(fā)生什么情況。
9)
public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}
這個(gè)方法是事件處理的中樞,它接受各種命令,并對(duì)其進(jìn)行分析,再分別調(diào)用合適的處理方法
。在這個(gè)例子中,當(dāng)接收到Exit命令以后,馬上銷(xiāo)毀程序,退出。
10)destroyApp()方法的作用是退出程序并銷(xiāo)毀程序?qū)ο蟆auseApp()方法的作用是暫停程序
,并銷(xiāo)毀容器對(duì)象或者是畫(huà)布對(duì)象。手機(jī)屏幕將會(huì)是一片空白。
javax.microedition.lcdui:用戶界面包,主要用于構(gòu)造程序的用戶界面。Command、Form都
是這個(gè)包的類。
javax.microedition.rms:這個(gè)包實(shí)現(xiàn)了對(duì)手機(jī)數(shù)據(jù)的存取功能。
javax.microedition.midlet:這個(gè)包是MIDlet程序的聲明周期包,主要定義了MIDlet類,MIDl
et類是一個(gè)抽象類,里面聲明了startApp()、destroyApp()、pauseApp()等抽象方法。
javax.microedition.io:網(wǎng)絡(luò)IO包。有HttpConnection接口和Connection接口、Datagram接
口。
java.io.*
java.lang.*
java.util.*
上面這三個(gè)包屬于J2ME核心包,J2ME中的核心包和J2SE中的同名核心包有些差別,主要是功能
大大簡(jiǎn)化了,許多類、方法都沒(méi)有了,只能實(shí)現(xiàn)一些最基本的功能。
J2ME開(kāi)發(fā)中有中文問(wèn)題嗎?可能有,但是我目前沒(méi)有遇到。因?yàn)槲覜](méi)有手機(jī),只能在模擬器上
運(yùn)行J2ME程序,真實(shí)的情況是什么樣子我也不知道。在水木上有人說(shuō)已經(jīng)出現(xiàn)了中文問(wèn)題,在
模擬器上好好的,到了真正的手機(jī)上卻是一團(tuán)亂碼。我現(xiàn)在也沒(méi)有辦法,只有在遇到的時(shí)候再
補(bǔ)上這一節(jié)。我寫(xiě)的測(cè)試程序如下所示,這個(gè)程序是在HelloWorld.java的基礎(chǔ)上改進(jìn)而來(lái)的
。
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class Poem extends MIDlet implements CommandListener
{
private Display display;
private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public Poem()
{
display = Display.getDisplay(this);
}
public void startApp()
{
props = new Form("影落寒潭的簽名檔");
props.append("小樓一夜聽(tīng)春雨\n");
props.append("深巷明朝賣(mài)杏花\n\r");
props.append("虹虹的簽名檔\n");
props.append("鴛鴦獨(dú)宿何曾慣\n");
props.append("化作西樓一縷云\n");
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}
public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}
public void destroyApp(boolean unconditional)
{
}
public void pauseApp()
{
display.setCurrent(null);
props = null;
}
}
使用普通的編輯器編輯好上述文件以后,保存為Poem.java,保存路徑為src\fancy\test。然
后在Ktoolbar中編譯,一切無(wú)誤之后,單擊Setting按鈕,出現(xiàn)一個(gè)配置窗口,選擇MIDlets面板
,單擊Add按鈕,依次輸入Poem、fancy.png、fancy.test.Poem三項(xiàng)。單擊OK按鈕,再單擊OK按
鈕,關(guān)閉配置窗口,回到Ktoolbar的主界面,再次編譯。一切無(wú)誤之后,單擊Run按鈕運(yùn)行程序。
Poem的運(yùn)行效果如下圖所示。
注意:每新編寫(xiě)一個(gè)程序,都要按照這個(gè)步驟進(jìn)行配置,再編譯運(yùn)行,我以后就不再重復(fù)描述
這個(gè)步驟了。
請(qǐng)看下面的代碼(Prop.java):
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
public class Prop extends MIDlet implements CommandListener
{
private Display display;
private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public Prop()
{
display = Display.getDisplay(this);
}
public void startApp()
{
props = new Form("System Properties");
props.append("Hello World!\n");
long time=System.currentTimeMillis();
props.append("current time:"+time+"\n");
props.append("microedition.configuration:"+
System.getProperty("microedition.configuration")+"\n");
props.append("microedition.profiles:"+
System.getProperty("microedition.profiles")+"\n");
props.append("microedition.platform:"+
System.getProperty("microedition.platform")+"\n");
props.append("microedition.locale:"+
System.getProperty("microedition.locale")+"\n");
props.append("microedition.encoding:"+
System.getProperty("microedition.encoding")+"\n");
props.append("java.version:"+System.getProperty("java.version")+"\n");//null
props.append("java.vendor:"+System.getProperty("java.vendor")+"\n");//null
props.append("java.vm.name:"+System.getProperty("java.vm.name")+"\n");//null
props.append("java.vm.version:"+System.getProperty("java.vm.version")+"\n");//
null
props.append("os.name:"+System.getProperty("os.name")+"\n");//null
props.append("os.arch:"+System.getProperty("os.arch")+"\n");//null
props.append("os.version:"+System.getProperty("os.version")+"\n");//null
props.append("user.name:"+System.getProperty("user.name")+"\n");//null
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}
public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}
public void destroyApp(boolean unconditional)
{
}
public void pauseApp()
{
display.setCurrent(null);
props = null;
}
}
這個(gè)程序的作用是輸出系統(tǒng)中各個(gè)環(huán)境屬性的值。訣竅是使用System類的getProperty()方
法。請(qǐng)注意,J2ME核心包的System類已經(jīng)不支持getProperties()方法了,而且很多環(huán)境屬性都
不再支持了,比如java.version、java.vendor等等。
查看內(nèi)存利用情況
請(qǐng)看程序(Memory.java):
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Memory extends MIDlet implements CommandListener
{
private Display display;
private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public Memory()
{
display = Display.getDisplay(this);
}
public void startApp()
{
props = new Form("Runtime Information");
long total=Runtime.getRuntime().totalMemory();
long free=Runtime.getRuntime().freeMemory();
props.append("total memory:"+total+"\n");
props.append("free memory:"+free+"\n");
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
}
public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}
public void destroyApp(boolean unconditional)
{
}
public void pauseApp()
{
display.setCurrent(null);
props = null;
}
}
這個(gè)程序的訣竅是利用Runtime類的totalMemory()方法以及freeMemory()方法。J2ME中的
Runtime類不再具有執(zhí)行外部程序的功能了,這是很顯然的。
List對(duì)象
發(fā)信站: 北大未名站 (2001年10月20日20:32:00 星期六) , 站內(nèi)信件
List屬于javax.microedition.lcdui包,它和Form一樣,同樣屬于容器類型的對(duì)象。屬于容
器類型的對(duì)象還有TextBox和Alert。我們?cè)谙旅孢€會(huì)介紹這兩個(gè)類的用法。此處首先介紹Li
st的用法。請(qǐng)看下面的程序(FormList.java):
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class FormList extends MIDlet implements CommandListener
{
private Display display;
private List list;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public FormList()
{
display = Display.getDisplay(this);
}
public void startApp()
{
list= new List("Choose URL", Choice.EXCLUSIVE);
list.append("www.pku.edu.cn",null);
list.append("www.yahoo.com",null);
list.append("fancyrainbow@263.net",null);
list.addCommand(exitCommand);
list.setCommandListener(this);
display.setCurrent(list);
}
public void commandAction(Command c, Displayable s)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}
public void destroyApp(boolean unconditional)
{
}
public void pauseApp()
{
display.setCurrent(null);
list = null;
}
}
請(qǐng)大家留意startApp()方法的內(nèi)部:
list= new List("Choose URL", Choice.EXCLUSIVE);
list.append("www.pku.edu.cn",null);
list.append("www.yahoo.com",null);
list.append("fancyrainbow@263.net",null);
list.addCommand(exitCommand);
list.setCommandListener(this);
display.setCurrent(list);
其邏輯流程如下:首先調(diào)用構(gòu)造函數(shù)實(shí)例化一個(gè)List對(duì)象(list),List對(duì)象實(shí)際上代表一個(gè)
選擇列表。List類的構(gòu)造函數(shù)的第一個(gè)參數(shù)是選擇列表的名字,第二個(gè)參數(shù)是選擇列表的形式
, Choice.EXCLUSIVE表示這個(gè)選擇列表只能夠單選。如果是Choice.MULTIPLE,則表示這個(gè)選
擇列表可以多選。List類的append()方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是選擇項(xiàng)的描述,第二個(gè)參
數(shù)是一個(gè)Image對(duì)象,代表每個(gè)選擇項(xiàng)前面的小圖標(biāo)。第二個(gè)參數(shù)可以是null值,但是第一個(gè)參
數(shù)是必須的。我們同樣可以使用addCommand()方法往List中注冊(cè)命令,也可以使用setComman
dListener()方法指定命令監(jiān)聽(tīng)者,這和Form是一樣的。在startApp()方法的最后,使用Displ
ay對(duì)象的setCurrent()方法將List對(duì)象設(shè)定為當(dāng)前的屏幕顯示對(duì)象。
posted on 2005-10-13 23:15
YangRj 閱讀(373)
評(píng)論(0) 編輯 收藏