[轉帖]J2ME學習札記2

shenvon36發表於2002-08-09
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);
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是單行的。而且TextBo
x是容器型別的物件,但是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!\n");
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.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");
//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)
{
destroyApp(false);
notifyDestroyed();
}
}

public void destroyApp(boolean unconditional)
{
}

public void pauseApp()
{
display.setCurrent(null);
props = null;
}

}
ShowDateField.java程式的執行效果如下面兩圖所示:

StringItem物件
發信站: 北大未名站 (2001年10月20日20:41:21 星期六) , 站內信件

StringItem物件和TextField、DateField物件類似,同樣屬於專案型別的物件。它的作用
就是在容器物件中顯示一條字串。
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);
}

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)
{
if (c == exitCommand)
{
destroyApp(false);
notifyDestroyed();
}
}

public void destroyApp(boolean unconditional)
{
}

public void pauseApp()
{
display.setCurrent(null);
props = null;
}

}
ShowStringItem.java程式的執行效果如下圖所示:


ImageItem物件
發信站: 北大未名站 (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類的建構函式有三個引數,第一個引數的作用是顯示一個標籤,第二個引數指明圖
片的對齊方式,第三個引數的作用是顯示圖片的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
{
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);
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;
}

}
ShowImageItem.java程式的執行效果如下圖所示:


ChoiceGroup物件
發信站: 北大未名站 (2001年10月20日21:12:23 星期六) , 站內信件

ChoiceGroup也是一個專案型別的物件,它代表一個選擇列表,它的作用和List物件類似,不
過後者是一個容器,而前者是一個專案。
我們需要特別注意ChoiceGroup類的建構函式,它有四個引數,第一個引數是標籤,第二個參
數是此選擇列表的型別,例如多選還是單選。第三個引數是一個字串陣列,代表每個選項的
標籤,第四個選項是一個Image型別的陣列,代表每個選項前面的小圖示。下面是一個比較完整
的例子。
package fancy.test;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class ShowChoiceGroup extends MIDlet implements CommandListener
{
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()
{
props = new Form("Hello World");
//props.append("Hello World!\n");
try
{
Image duke= Image.createImage("/fancy/test/Icon.png");
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)
{
//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;
}
}
ShowChoiceGroup.java程式的執行效果如下圖所示:

Gauge物件
發信站: 北大未名站 (2001年10月20日21:13:19 星期六) , 站內信件

Gauge物件是一個專案型別的物件,它的作用是顯示一個進度條。請看下面的原始碼。Gaug
e類的建構函式的後面兩個引數分別是進度條的最大值和初始值。
package fancy.test;

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);
}

public void startApp()
{
props = new Form("Hello World");
//props.append("Hello World!\n");
Gauge gauge=new Gauge("show gauge",true,100,50);
props.append(gauge);
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;
}

}
ShowGauge.java程式的執行效果如下圖所示:

相關文章