J2ME手机游戏设计与开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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 添加多个软键效果图