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!
");
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);
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)
{
destroyApp(false);
notifyDestroyed();
}
else if(c==helpCommand)
{
showScreen("help");
}
else if(c==backCommand)
{
showScreen("back");
}
else if(c==cancelCommand)
{
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()方法會產生一個新的容器對象(Form),作為當前的屏幕,並把截獲的命令顯示在屏幕中。
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);
}
public void startApp()
{
//or :
//String str="hello world";
//txtBox = new TextBox("Text Box",str,str.length(),0);
//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();
}
}
public void destroyApp(boolean unconditional)
{
}
public void pauseApp()
{
display.setCurrent(null);
txtBox = null;
}
}
請注重TextBox類的構造函數,第一個參數實際上是窗口的名稱(因為TextBox是一個容器,可能是當前屏幕的顯示對象),第二個參數是缺省值,第三個參數是輸入字符的總長度。假如你設置了文本框的缺省值,那麼第三個參數必須是缺省字符的長度。假如第三個參數的值和缺省字符的長度不一樣,那麼程序運行不成功(編譯可以通過)。假如你將第二個參數置為null值,那麼第三個參數可以任意設。
ShowTextBox.java的運行效果如下圖所示:
TextField文本域對象
發信站: 北大未名站 (2001年10月20日20:37:59 星期六) , 站內信件
TextField和TextBox有點相似,不過TextBox是多行的,而TextField是單行的。而且TextBox是容器類型的對象,但是TextField是項目類型的對象,只能夠被容器包含,不能夠單獨顯示。
TextField文本域對象的用法如下所示:
package fancy.test;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
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!
");
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)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}
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
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.microeditio