阅读导航:
1、Form 类
2、Item 类
1、Form 类
Form类是高级界面Screen类的直接子类。是使用最灵活的高级界面。他可以包含一下8种组件的任意组合:TextField(文本组件)、StringItem(字符串组件)、ImageItem(图像组件)、DataField(日期组件)、ChoiceGroup(选项集合)、Gauge(标尺)以及MIDP 2.0引入的CustomItem(自定义组件)和Spacer(占位符)。通常Item类的任何子类都可以包含进表单中。
(1)构造方法
Form有两个构造方法:(a)Form(String title)――根据指定标题创建新的Form对象,title可设为null,表示没有标题。
构造完成之后Form表单不包含任何组件,然后使用append或者insert方法插入元素,例如:
Form mainForm = new Form("标题");
mainForm.append(item);
(b)Form(String title,Item[] items)――带标题并且初始化所包含的组件元素,参数title和items都可以为null,表示没有标题和没有组件。例如:
Item[] items = new Item[]{
new TextField("用户名:","HanMeimei",50,TextField.ANY),
new TextField("密码:","123456",50,TextField.PASSWORD)
};
Form mainForm = new Form("Form演示:登录",items);
构造完成Form对象之后,使用Display的方法setCurren()把它设置为当前显示屏幕,从而显示信息或者与用户进行交互。
(2)添加Command
和其他Displayable对象一样,Form对象也可以在其中添加Command对象,并调用setCommandListener()方法来绑定一个事件监听器。
(3)侦听事件
当放置于Form对象上组件内部的用户接口组件内部状态改变时,内部组件会对所有经由setItemStateListener()向它注册的类中的itemStateChanged()方法发出状态改变的消息。
应用程序使用ItemStateListener接口来接收Form对象内可交互组件的事件,这些事件用来指示组件内部状态的改变。
以下操作会调用itemStateChanged(Item item)方法:
(a)改变ChoiceGroup中的选择状态;
(b)调整了Gauge的值;
(c)输入或者改变了TextField中的值;
(d)在DateField中输入一个新 的如期或者时间;
(e)Item.notifyStateChanged()被组件对象调用。
2、Item 类
Item类是一个虚类,因此它没有构造方法,它的子类对象就是表单(Form)中的组件,作为参数传递给Form对象与用户进行交互。
下面是Item类及其直接子类的继承关系图:
(1)Item对象的事件监听
MIDP 2.0还允许Item组件添加软键Command对象,并且绑定ItemCommandListener组件软键事件监听器,ItemCommandListener的使用和CommandListener的使用大同小异。可以为Item组件添加Command或者DefaultCommand对象,然后绑定ItemCommandListener监听器。其相关操作如下:
- 增加和删除Command数组必须依靠addCommand()和removeCommand()。
- 设定ItemCommandListener的引用要使用setItemCommandListener()。
- 设定DefaultCommand必须使用setDefaultCommand()。
当将Item加入Form后,所选的Item内部的Command数组就会变成系统菜单项。
任何菜单项被选定后,实现了ItemCommandListener接口的类中的commandAction()方法就会被调用。
需要说明的是,commandAction(Command c,Item i)方法也可以使用Item变量i进行选择响应,例如:
public void commandAction(Command c,Item i){
if(i==oneItem){
if(c==oneCommand){
......... //相应处理
}
}else if(i==otherItem){
if(c==otherCommand){
......... //相应处理
}
}
}
3、应用范例
下面给出一个应用范例程序,
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
public class Demo extends MIDlet implements CommandListener {
private Command exitC = new Command("Exit", Command.EXIT, 1);
private boolean firstTime;
private Form mainForm; //创建 Form 对象
private TextField textField; //创建 TextField 对象
private StringItem item; //创建 StringItem 对象
public Demo() {
firstTime = true;
mainForm = new Form("Text Field");
textField = new TextField("textField text", "", 15, TextField.ANY);
item = new StringItem(": ", "text");
}
protected void startApp() {
if (firstTime) {
mainForm.append("textField");
mainForm.append("item");
mainForm.addCommand(exitC);
mainForm.setCommandListener(this);
firstTime = false;
}
Display.getDisplay(this).setCurrent(mainForm);
}
public void commandAction(Command c, Displayable s) {
if (c == exitCommand) {
destroyApp(false);
notifyDestroyed();
}
}
protected void destroyApp(boolean unconditional) {
}
protected void pauseApp() {
}
}
高级界面API虽然已经封装好了,不过不同的手机比如诺基亚和索尼爱立信,相同的程序也许某个组件的显示效果也会有所不同,那是因为手机的操作系统和本身硬件支持的不同引起。用户在开发时可以真机测试,看看效果。
本节只是粗略介绍Form类和Item类,具体的属性和方法就不一一陈述,因为Wireless Toolkit 自带了包含了所有的API文档,开发者可以随时研究。本人只是起到抛砖引玉的作用,讲解中不足之处望高手们多多指教:-)。
随后的章节将会总结J2ME低级界面开发应用。