Command對象
發信站: 北大未名站 (2001年10月20日20:33:56 星期六) , 站內信件
在前面我們其實已經使用過Command對象了。J2ME的事件系統比較特殊,你必須首先定義一
系列的命令,然後注冊到容器對象中,例如(Form、Alert、List、TextBox),再設定命令監聽者
,編寫好commandAction()方法即可。當系統發送某個命令,便由commandAction()方法進行統
籌處理。下面的程序演示了如何定義多個命令以及如何編寫commandAction()方法。
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class CMD extends MIDlet implements CommandListener
{;
private Display display;
private Form props;
private Command backCommand = new Command("BACK", Command.BACK, 2);
private Command cancelCommand = new Command("CANCEL", Command.CANCEL, 1);
private Command exitCommand = new Command("EXIT", Command.EXIT, 1);
private Command helpCommand = new Command("HELP", Command.HELP, 1);
private Command itemCommand = new Command("ITEM", Command.ITEM, 1);
private Command okCommand = new Command("OK", Command.OK, 1);
private Command screenCommand = new Command("SCREEN", Command.SCREEN, 1);
private Command stopCommand = new Command("STOP", Command.STOP, 1);
public CMD()
{;
display = Display.getDisplay(this);
};
public void startApp()
{;
props = new Form("Hello World");
props.append("Hello World!\n");
props.addCommand(backCommand);
props.addCommand(cancelCommand);
props.addCommand(exitCommand);
props.addCommand(helpCommand);
props.addCommand(itemCommand);
props.addCommand(okCommand);
props.addCommand(screenCommand);
props.addCommand(stopCommand);
props.setCommandListener(this);
Java手機網[www.cnjm.Net]display.setCurrent(props);
};
public void showScreen(String cmd)
{;
Form form=new Form("show cmd");
form.append(cmd);
form.addCommand(exitCommand);
form.setCommandListener(this);
display.setCurrent(form);
};
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
Java手機網[www.cnjm.Net]{;
destroyApp(false);
notifyDestroyed();
Java手機網[www.cnjm.Net]};
else if(c==helpCommand)
{;
showScreen("help");
};
else if(c==backCommand)
{;
showScreen("back");
};
Java手機網[www.cnjm.Net]else if(c==cancelCommand)
{;
Java手機網[www.cnjm.Net]showScreen("cancel");
};
else if(c==itemCommand)
{;
showScreen("item");
};
else if(c==okCommand)
{;
showScreen("ok");
};
else if(c==screenCommand)
{;
showScreen("screen");
};
if(c==stopCommand)
{;
showScreen("stop");
};
};
public void destroyApp(boolean unconditional)
{;
};
public void pauseApp()
{;
display.setCurrent(null);
props = null;
};
};
在上面的程序(CMD.Java)中定義了八個命令。如果commandAction()方法接到這八個命令,
多半是調用showScreen()方法,將這幾個命令輸出。showScreen()方法會產生一個新的容器對
Java手機網[www.cnjm.Net]象(Form),作為當前的屏幕,並把截獲的命令顯示在屏幕中。
Java手機網[www.cnjm.Net]CMD.Java的運行效果如下2圖所示(當屏幕出現Hello World字樣的時候,你需要按下退出鍵
,命令菜單就會出現了,你可以依次執行各個命令)。
TextBox文本框對象
發信站: 北大未名站 (2001年10月20日20:36:34 星期六) , 站內信件
TextBox是一個容器類型的對象(和Form的性質一樣)。用法如下所示:
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class ShowTextBox extends MIDlet implements CommandListener
{;
private Display display;
private TextBox txtBox;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ShowTextBox()
{;
display = Display.getDisplay(this);
Java手機網[www.cnjm.Net] };
public void startApp()
{;
//or :
//String str="hello world";
Java手機網[www.cnjm.Net]//txtBox = new TextBox("Text Box",str,str.length(),0);
Java手機網[www.cnjm.Net]//the follow code is wrong:
//txtBox = new TextBox("Text Box",str,any number here,0);
txtBox = new TextBox("Text Box",null,200,0);
txtBox.addCommand(exitCommand);
txtBox.setCommandListener(this);
display.setCurrent(txtBox);
};
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
{;
destroyApp(false);
notifyDestroyed();
Java手機網[www.cnjm.Net]};
};
public void destroyApp(boolean unconditional)
{;
};
public void pauseApp()
Java手機網[www.cnjm.Net]{;
display.setCurrent(null);
Java手機網[www.cnjm.Net]txtBox = null;
};
};
請注意TextBox類的構造函數,第一個參數實際上是窗口的名稱(因為TextBox是一個容器,可
能是當前屏幕的顯示對象),第二個參數是缺省值,第三個參數是輸入字符的總長度。如果你設
置了文本框的缺省值,那麼第三個參數必須是缺省字符的長度。如果第三個參數的值和缺省字
符的長度不一樣,那麼程序運行不成功(編譯可以通過)。如果你將第二個參數置為null值,那
麼第三個參數可以任意設。
ShowTextBox.Java的運行效果如下圖所示:
TextFIEld文本域對象
發信站: 北大未名站 (2001年10月20日20:37:59 星期六) , 站內信件
TextField和TextBox有點相似,不過TextBox是多行的,而TextFIEld是單行的。而且TextBo
x是容器類型的對象,但是TextFIEld是項目類型的對象,只能夠被容器包含,不能夠單獨顯示。
TextFIEld文本域對象的用法如下所示:
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
Java手機網[www.cnjm.Net]public class ShowTextFIEld extends MIDlet implements CommandListener
{;
private Display display;
private Form props;
private TextField txtFIEld;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ShowTextFIEld()
{;
display = Display.getDisplay(this);
};
public void startApp()
{;
props = new Form("Hello World");
props.append("Hello World!\n");
Java手機網[www.cnjm.Net]txtField=new TextField("EMail:", "", 15,TextFIEld.EMAILADDR);
props.append(txtFIEld);
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
};
public void commandAction(Command c, Displayable s)
Java手機網[www.cnjm.Net]{;
if (c == exitCommand)
{;
destroyApp(false);
notifyDestroyed();
};
};
Java手機網[www.cnjm.Net]public void destroyApp(boolean unconditional)
{;
};
public void pauseApp()
{;
display.setCurrent(null);
props = null;
};
};
請注意startApp()方法,我們使用Form對象作為當前屏幕的顯示對象,而將TextFIEld對象作
為Form的一個子項目顯示。下面來介紹TextFIEld類的構造函數,第一個參數是文本域的名稱
,第二個參數是缺省值,第三個參數是長度,第四個參數是文本域的類型,可選的值有: TextFi
eld.PASSWord、TextField.EMAILADDR、TextField.PHONENUMBER、TextFIEld. URL、TextFi
Java手機網[www.cnjm.Net]eld. NUMERIC等等。構造好TextFIEld對象之後,調用Form的append()方法將它添加到Form對
象的子項目中。ShowTextFIEld.Java程序的運行效果如下圖所示:
DateFIEld對象
發信站: 北大未名站 (2001年10月20日20:39:14 星期六) , 站內信件
DateField對象和TextFIEld對象一樣同屬於項目類型的對象,不能夠單獨顯示,必須作為容
器對象的子項目顯示。DateFIEld對象的作用是顯示一個日期,它和Windows控制面板中的時間
和日期設置程序有點近似。DateFIEld對象的用法如下所示:
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class ShowDateFIEld extends MIDlet implements CommandListener
{;
private Display display;
private Form props;
private DateField datFIEld;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ShowDateFIEld()
{;
display = Display.getDisplay(this);
};
public void startApp()
{;
props = new Form("Hello World");
props.append("Hello World!\n");
Java手機網[www.cnjm.Net]//change:
//datField=new DateField("Date:",DateFIEld.DATE_TIME);
//datField=new DateField("Date:",DateFIEld.TIME);
datField=new DateField("Date:",DateFIEld.DATE);
props.append(datFIEld);
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
};
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
{;
Java手機網[www.cnjm.Net]destroyApp(false);
notifyDestroyed();
};
};
Java手機網[www.cnjm.Net]public void destroyApp(boolean unconditional)
{;
};
public void pauseApp()
{;
display.setCurrent(null);
props = null;
Java手機網[www.cnjm.Net] };
};
ShowDateFIEld.Java程序的運行效果如下面兩圖所示:
StringItem對象
發信站: 北大未名站 (2001年10月20日20:41:21 星期六) , 站內信件
StringItem對象和TextField、DateFIEld對象類似,同樣屬於項目類型的對象。它的作用
Java手機網[www.cnjm.Net]就是在容器對象中顯示一條字符串。
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class ShowStringItem extends MIDlet implements CommandListener
{;
private Display display;
private Form props;
private StringItem strItem;
private StringItem strItem2;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ShowStringItem()
{;
display = Display.getDisplay(this);
};
Java手機網[www.cnjm.Net]public void startApp()
{;
props = new Form("Hello World");
props.append("Hello World!\n");
strItem=new StringItem("signature:","小樓一夜聽春雨");
strItem2=new StringItem("signature:","三教明天考物化");
props.append(strItem);
props.append(strItem2);
props.addCommand(exitCommand);
props.setCommandListener(this);
display.setCurrent(props);
};
public void commandAction(Command c, Displayable s)
{;
Java手機網[www.cnjm.Net]if (c == exitCommand)
{;
destroyApp(false);
notifyDestroyed();
};
};
public void destroyApp(boolean unconditional)
{;
};
public void pauseApp()
{;
Java手機網[www.cnjm.Net]display.setCurrent(null);
props = null;
};
};
ShowStringItem.Java程序的運行效果如下圖所示:
ImageItem對象
Java手機網[www.cnjm.Net]發信站: 北大未名站 (2001年10月20日21:10:50 星期六) , 站內信件
ImageItem對象是一個項目類型的對象,他的作用是在容器中顯示圖片。那麼如何使用Imag
eItem對象呢?請按照下面三個步驟進行:
1.構造一個Image對象,相關代碼如下所示:
Image img=Image.createImage("/fancy/test/JavaPowered-8.png");
createImage()方法是Image類的靜態方法,它的作用是根據圖形文件創建一個Image對象。
J2ME程序中所用到的圖片文件必須存放在aPPS\fancy\res文件夾下面。
2.構造ImageItem對象,相關代碼如下所示:
imgItem=new ImageItem("Default Layout",img,ImageItem.LAYOUT_DEFAULT,
"Image Cannot be shown");
ImageItem類的構造函數有三個參數,第一個參數的作用是顯示一個標簽,第二個參數指明圖
Java手機網[www.cnjm.Net]片的對齊方式,第三個參數的作用是顯示圖片的tip。
3.利用容器類對象的append()方法將ImageItem對象添加進去。如:
props.append(imgItem);
下面我們來看一個比較完整的例子。
package fancy.test;
import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class ShowImageItem extends MIDlet implements CommandListener
{;
Java手機網[www.cnjm.Net]private Display display;
private Form props;
private Image img;
private ImageItem imgItem;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ShowImageItem()
{;
display = Display.getDisplay(this);
};
public void startApp()
{;
props = new Form("Hello World");
//props.append("Hello World!\n");
try
{;
img=Image.createImage("/fancy/test/JavaPowered-8.png");
imgItem=new ImageItem("Default Layout",
img,ImageItem.LAYOUT_DEFAULT,"Image Cannot be shown");
props.append(imgItem);
props.append(new ImageItem("Left Layout",
img,ImageItem.LAYOUT_LEFT,"Image Cannot be shown"));
props.append(new ImageItem("Center Layout",
img,ImageItem.LAYOUT_CENTER,"Image Cannot be shown"));
};
catch(Exception fe)
{;
//to do nothing
};
props.addCommand(exitCommand);
props.setCommandListener(this);
Java手機網[www.cnjm.Net]display.setCurrent(props);
Java手機網[www.cnjm.Net] };
public void commandAction(Command c, Displayable s)
{;
if (c == exitCommand)
{;
destroyApp(false);
notifyDestroyed();
};
};
public void destroyApp(boolean unconditional)
Java手機網[www.cnjm.Net]{;
};
public void pauseApp()
{;
display.setCurrent(null);
props = null;
Java手機網[www.cnjm.Net] };
};
ShowImageItem.Java程序的運行效果如下圖所示:
ChoiceGroup對象
發信站: 北大未名站 (2001年10月20日21:12:23 星期六) , 站內信件
ChoiceGroup也是一個項目類型的對象,它代表一個選擇列表,它的作用和List對象類似,不
過後者是一個容器,而前者是一個項目。
我們需要特別注意ChoiceGroup類的構造函數,它有四個參數,第一個參數是標簽,第二個參
數是此選擇列表的類型,例如多選還是單選。第三個參數是一個字符串數組,代表每個選項的
標簽,第四個選項是一個Image類型的數組,代表每個選項前面的小圖標。下面是一個比較完整
的例子。
package fancy.test;
import Javax.microedition.midlet.*;
Java手機網[www.cnjm.Net]import Javax.microedition.lcdui.*;
public class ShowChoiceGroup extends MIDlet implements CommandListener
Java手機網[www.cnjm.Net]{;
private Display display;
private Form props;
private Image duke;
private Image[] imageArray;
private ChoiceGroup choice;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ShowChoiceGroup()
{;
display = Display.getDisplay(this);
};
public void startApp()
Java手機網[www.cnjm.Net]{;
Java手機網[www.cnjm.Net]props = new Form("Hello World");
//props.append("Hello World!\n");
try
{;
Java手機網[www.cnjm.Net]Image duke= Image.createImage("/fancy/test/Icon.png");
Java手機網[www.cnjm.Net]imageArray = new Image[]{;duke,duke,duke};;
String[] stringArray = {; "Option A", "Option B",
"Option C" };;
choice=new ChoiceGroup("choice group",
ChoiceGroup.MULTIPLE,stringArray,imageArray);
props.append(choice);
};
catch(Exception fe)
Java手機網[www.cnjm.Net]{;
//to do nothing.
};
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;
};
Java手機網[www.cnjm.Net]};
ShowChoiceGroup.Java程序的運行效果如下圖所示:
Java手機網[www.cnjm.Net]Gauge對象
發信站: 北大未名站 (2001年10月20日21:13:19 星期六) , 站內信件
Java手機網[www.cnjm.Net]Gauge對象是一個項目類型的對象,它的作用是顯示一個進度條。請看下面的源代碼。Gaug
e類的構造函數的後面兩個參數分別是進度條的最大值和初始值。
package fancy.test;
Java手機網[www.cnjm.Net]import Javax.microedition.midlet.*;
import Javax.microedition.lcdui.*;
public class ShowGauge extends MIDlet implements CommandListener
{;
private Display display;
private Form props;
private Command exitCommand = new Command("Exit", Command.EXIT, 1);
public ShowGauge()
{;
display = Display.getDisplay(this);
};
Java手機網[www.cnjm.Net]public void startApp()
{;
props = new Form("Hello World");
//props.append("Hello World!\n");
Gauge gauge=new Gauge("show gauge",true,100,50);
Java手機網[www.cnjm.Net]props.append(gauge);
props.addCommand(exitCommand);
Java手機網[www.cnjm.Net]props.setCommandListener(this);
Java手機網[www.cnjm.Net]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;
};
};