3.3 高级屏幕类的事件响应
如果仅有显示界面的话,程序是没有意义的,建立良好的用户交互是应用程序中非常重要的环节,本节内容将对程序中进行交互的事件响应机制进行分析和讲解。
3.3.1 事件响应基本原理
在MIDP程序中交互的方式与Java程序类似,就是依靠事件响应机制,当触发某个事件时(例如按下按钮)则调用事件的响应方法,执行相应的方法中所编写的逻辑内容。
高级事件处理主要是由两个接口实现的,一个是CommandListener,其中定义了方法commandAction(Command cmd,Displayable disp),当在被显示界面中按下按钮时执行这个方法内的代码;另一个是ItemStateListener(Item item),当应用程序对Form界面中添加的Item组件进行操作时执行这个方法内的具体代码,例如在TextField内输入或修改文本内容、改变ChoiceGroup内的选择状态等。
3.3.2 Command类及其常用方法
Command:javax.microedition.lcdui.Command
Command类不是高级屏幕类,而是能够添加在高级屏幕类对象上的进行交互响应的对象。Command类封装了一个动作的语义信息,主要以用户界面的形式来表达,其常用方法如表3-5所示。
表3-5 Command类的常用方法
Command类的具体用法如下。
首先定义并构造一个Command对象实例:
Command cmd; cmd=new Command("退出",Command.EXIT,1);
然后将Command对象添加到Form上:
Form mainForm=new Form("Command"); mainForm.addCommand(cmd);
构建Command对象时,第1个参数“退出”为Command对象的标签,显示给用户表示Command对象的名称。第2个参数“Command.EXIT”代表的是Command对象的类型,Command类中定义了8种类型,代表不同的语义,其具体类型及含义如表3-6所示。第3个参数表示Command对象的优先级,必须为整数,数值为1代表非常重要,依次为2、3、4等。
表3-6 Command对象类型
说明:
1.如果软键类型的值无效,则抛出java.lang.IllegalArgumentException;
2.如果标签参数的值为null,则抛出java.lang.NullPointerException;
3.一旦对象构造完成,就不能再对标签、类型、优先级3个信息进行修改;
4.如果是相同类型,则优先级高的最容易被找到;
5.当添加多个软键时,左右位置有可能会发生改变;
6.所定义的类型值并不是一定按照对应操作执行的,需要通过接口CommandListener来具体实现。例如定义软键的类型为退出,但是真正实现程序的退出需要由CommandListener编写代码来完成真正的退出操作。
3.3.3 CommandListener接口
如果只是添加Command对象并不能实现具体的功能,只有为高级屏幕类中的Command对象添加监听后,才会接收来自MIDP实现的高级事件,响应具体操作。
Command cmd; cmd=new Command("退出",Command.EXIT,1); Form mainForm=new Form("Command"); mainForm.addCommand(cmd); mainForm.setCommandListener(this);
以上最后一句代码中的参数this表示传入的参数为本类,而setCommandListener方法需要传入的参数是CommandListener对象,所以要让本类实现CommandListener接口,类头就会被改为public class mainMidlet extends MIDlet implements CommandListener。实现CommandListener接口就要实现接口中的抽象方法CommandAction()。例如:
public void commandAction(Command c, Displayable d) { try { if(c==cmd) { //执行程序退出 destroyApp(false); notifyDestroyed(); } } catch (Exception e) { } }
程序的执行结果如图3-4所示。
destroyApp():当程序调用destroyApp()时,系统通知MIDlet进入Destroyed状态,如果传入的参数为false,那么MIDlet可以在接收通知后抛出MIDletStateChangeException异常而保持当前状态,如果传入的参数为true则立即进入Destroyed状态。在一个程序中可以添加多个软键,代码参见【例3-3】。
【例3-3】 添加多个软键。
import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class mainMidlet extends MIDlet implements CommandListener{ Display display; Command commmandOK; Command commmandCancel; Command commmandScreen; Command commmandExit; Form f; public mainMidlet() { display=Display.getDisplay(this); commmandCancel=new Command("取消",Command.CANCEL,2); commmandOK=new Command("确定",Command.OK,2); commmandExit=new Command("结束",Command.EXIT,1); commmandScreen=new Command("屏幕",Command.SCREEN,2); f=new Form("Command"); //添加按钮 f.addCommand(commmandCancel); f.addCommand(commmandExit); f.addCommand(commmandOK); f.addCommand(commmandScreen); f.setCommandListener(this); } protected void destroyApp(boolean arg0) throws MIDletStateChange Exception { } protected void pauseApp() { } protected void startApp() throws MIDletStateChangeException { display.setCurrent(f); } public void commandAction(Command cmd, Displayable d) { try { if(cmd==commmandCancel) { System.out.println("cancel"); }else if(cmd==commmandOK) { System.out.println("ok"); }else if(cmd==commmandScreen) { System.out.println("screen"); }else if(cmd==commmandExit) { destroyApp(false); notifyDestroyed(); } } catch (Exception e) { } } }
程序的执行结果如图3-5所示,当按下不同的软键时控制台会输出不同的提示信息。
图3-4 “退出”软键
图3-5 添加多个软键效果图