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

3.4 Screen类及其子类的应用

高级屏幕类Screen有4个子类TextBox、List、Alert和Form,都是已经封装好的屏幕类。Screen又是Displayable类的子类,因此它的4个子类可以继承Displayable类的所有方法。

3.4.1 Ticker滚动条

Ticker类为滚动条,所有高级屏幕类都可以通过调用setTicker()方法添加滚动条,用来显示一些提示信息,常用方法如下:

public Ticker(String s)                         //根据指定的字符串生成一个新的Ticker对象
public String getString()               //获取当前在Ticker对象中滚动的字符串
public void setString(String str)       //设置要在Ticker对象中滚动的字符串

是否支持滚动条与具体的设备有关,不是所有的设备都能够显示滚动条效果的。下面的程序是为Form对象添加滚动条,代码参见【例3-4】。

【例3-4】 滚动条效果。

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class mainMidlet extends MIDlet {
Display display;
    Form f;
    Ticker t;
    public mainMidlet() {
        display=Display.getDisplay(this);
        f=new Form("滚动条效果");
        t=new Ticker("这里是滚动条!!!");
        f.setTicker(t);
    }
    protected void destroyApp(boolean arg0) throws MIDletStateChange Exception {        }
    protected void pauseApp() { }
    protected void startApp() throws MIDletStateChangeException {
        display.setCurrent(f);
    }
}

执行效果如图3-6所示。

同一个滚动条可以被多个Screen对象共用,可以通过在各个Screen对象中分别调用setTicker()方法来实现。当应用程序在多个屏幕之间切换时,滚动条在显示屏幕上的位置不变,并且它的内容会在原来的位置上继续滚动。若要取消滚动条则在setTicker()方法中设置参数为null。

图3-6 滚动条效果图

3.4.2 TextBox文本框类

TextBox类继承了Screen类,用于用户输入或者编辑文本内容。TextBox类的常用方法如表3-7所示。

表3-7 TextBox类的常用方法

创建并使用TextBox对象:

TextBox tb;
tb=new TextBox("文本框","初始化内容",20,TextField.ANY);

其中“文本框”为其标题,“初始化内容”为文本框最开始时的内容,可以设置为null或者空字符串,20为tb中内容输入的最大字符数,必须为大于0的整数,最后一个参数为输入约束,TextField.ANY表示可以输入任意字符,其他约束类型如表3-8所示。

注意:每个英文字符的长度为1,汉字的长度为2,如果存在初始化内容,则最大字符数一定要大于初始化内容,否则抛出异常,如【例3-4】中长度如果为4则抛出异常。

通过Display对象将TextBox对象显示在屏幕上,效果如图3-7所示。

图3-7 TextBox实例效果

表3-8 输入约束类型

可以调用TextBox对象的相关方法改变TextBox的属性设置。

(1)设置文本内容。

char[] data=new String("hello world!").toCharArray();
tb.setChars(data,1,11);

(2)获取文本内容。

char[] data=new char[tb.size()];
tb.getChars(data);

(3)插入文本内容。

tb.insert("text1",0);
tb.insert("text2",tb.getMaxSize());
tb.insert("text3",tb.getCaretPosition()); //将指定内容插入到光标处

下面利用文本框来实现一个简单的登录界面,具体内容参见【例3-5】。

【例3-5】 用户名和密码的输入与验证。

在编写程序之前应该首先对程序进行分析,绘制相应的流程图,这里由于手机屏幕每次只能显示一个TextBox对象,所以用户名和密码的验证要分成两次来完成,然后通过Display对象的setCurrent()方法来切换。同时为了响应验证操作,需要在程序中添加Command对象,在CommandAction()方法中编写具体的逻辑。程序功能流程图如图3-8所示。

图3-8 程序功能流程图

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class mainMidlet extends MIDlet implements CommandListener {
    Display display;
    TextBox tbName,tbPwd;
    Command cmdEnter;
    public mainMidlet() {
        display=Display.getDisplay(this);
        tbName=new TextBox("请输入用户名","",12,TextField.ANY);
        tbPwd=new TextBox("请输入密码","",6,TextField.NUMERIC);
        cmdEnter=new Command("确定",Command.OK,1);
        tbName.addCommand(cmdEnter);
        tbName.setCommandListener(this);
        tbPwd.addCommand(cmdEnter);
        tbPwd.setCommandListener(this);
    }
    protected void destroyApp(boolean arg0) throws MIDletStateChange Exception {        }
    protected void pauseApp() { }
    protected void startApp() throws MIDletStateChangeException {
        display.setCurrent(tbName);
    }
    public void commandAction(Command c, Displayable d) {
        if(c==cmdEnter && d==tbName)
        {
            if(tbName.getString().equals("abc"))
            display.setCurrent(tbPwd);
            else
            tbName.setString("输入错误");
        }
        if(c==cmdEnter && d==tbPwd)
        {
            if(tbPwd.getString().equals("123"))
            {
                tbName.setTitle("输入结果");
                tbName.setString("全部正确");
                display.setCurrent(tbName);
            }
            else
            {
                tbName.setString("密码错误");
                display.setCurrent(tbName);
            }
        }
    }
}

执行效果图如图3-9所示。

图3-9 用户名和密码的输入与验证效果图

在这里因为还没有介绍有关数据存储的内容,所以用户名和密码就在程序中指定了,如果学习了数据存储,就可以从数据库中读取相应的用户名和密码。

3.4.3 List列表类

List类是一个包含选项的高级屏幕类,实现对多项列表项进行选择功能。List类是Screen类的子类,同时也实现了Choice接口。List类的常用方法如表3-9所示。

表3-9 List类的常用方法

创建并使用List对象:

List list;
list=new List("列表选项",List.IMPLICIT);

第1个参数是List对象的标题字符串,第2个参数是代表列表的选项类型,List共提供3种对象类型。

(1)EXCLUSIVE:单选模式。要求只能在列表中选择一个选项,当选择第2个选项时之前选中的将被取消,而且选择选项不会触发任何事件。

(2)MULTIPLE:复选模式。用户可以在列表中选择一个或多个选项,同样也不会触发任何事件。

(3)IMPLICIT:隐含模式。对于这种模式下的列表同样也是单选的,但是如果设置CommandLister,选择操作会立即通知到应用程序,触发相应事件,相当于封装了按钮操作。

列表建立后只有一个标题,需要通过调用append()方法添加列表项,例如:

list.append("First",null);
list.append("Second",null);
list.append("Third",null);

最后通过Display对象显示List对象:

Display.getDisplay(this).setCurrent(list);

执行效果如图3-10所示。

图3-10 列表的不同选项类型效果图

下面利用List对象来实现菜单选择的功能,具体实现参见【例3-6】。

【例3-6】 游戏菜单的实现。

利用List对象来实现菜单选项,当选择不同的菜单项时响应不同的操作或提示信息。执行效果如图3-11所示。

图3-11 游戏菜单效果图

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class ListMidlet extends MIDlet implements CommandListener {
    Display display;
    List list;
    Command commandOk;
    Command commandCancel;
    public ListMidlet() {
        display=Display.getDisplay(this);
        list=new List("游戏菜单",List.EXCLUSIVE);
        list.append("开始游戏",null);
        list.append("游戏说明",null);
        list.append("高分榜",null);
        list.append("退出",null);
        commandCancel=new Command("取消",Command.CANCEL,1);
        commandOk=new Command("确定",Command.CANCEL,2);
        list.addCommand(commandCancel);
        list.addCommand(commandOk);
        list.setCommandListener(this);
    }
    protected void destroyApp(boolean arg0) {   }
    protected void pauseApp() { }
    protected void startApp() throws MIDletStateChangeException {
        display.setCurrent(list);
    }
    public void commandAction(Command cmd, Displayable arg1) {
        if(cmd==commandOk){
            //当按下“确定”软键时,根据列表的选项序号判断执行不同的操作
            switch(list.getSelectedIndex())
            {
             case 0:
                System.out.println("开始游戏");break;
             case 1:
                System.out.println("游戏说明");break;
             case 2:
                System.out.println("退出");break;
             case 3:
                System.out.println("高分榜");break;
            }
        }else if(cmd==commandCancel)
        {
            destroyApp(false);
            notifyDestroyed();
        }
    }
}

3.4.4 Alert信息提示类

Alert类主要用于实现提醒功能,在设备上显示一个警告屏幕,例如字符串,也可以包含预定义的声音和图像。提示信息可以一直保持在屏幕上,由用户取消,也可以设定时间自动切换屏幕内容。Alert类的常用方法如表3-10所示。

表3-10 Alert类的常用方法

创建并使用Alert对象:

Alert alert1,alert2;
alert1=new Alert("警告框");
alert2=new Alert("警告框","警告信息!!",null,AlertType.WARNING);

Alert类有两个构造函数,第一个构造函数只需要指定Alert的标题,第二个构造函数需要指定标题、显示内容、图像和警告类型。 其中AlertType提供了以下几种类型。

·ALARM(警报):向用户警告一个时间,它是用户预先请求的通知。

·CONFIRMATION(确定):用来确认一个用户动作。

·ERROR(错误):向用户警告一个错误操作。

·INFO(通知):一般向用户提示非危险性信息。

·WARNING(警告):向用户警告一个危险操作。

利用Display对象将其显示在屏幕上:

Display.setCurrent(alert1);

效果如图3-12(a)所示。

Alert对象显示一段时间后就会切换为另一个屏幕,所以在设置显示屏幕时需要同时设置切换后的屏幕对象:

display.setCurrent(alert,nextDisplayable);

如果要改变Alert对象的显示时间,可以调用setTimeout()方法。

alert.setTimeout(3000);                         //3000为毫秒,1000毫秒=1秒
alert.setTimeout(Alert.FOREVER);        // Alert.FOREVER表示Alert对象不会自动切换,需要用户手动切换,效果如图3-12(b)所示

图3-12 Alert效果

下面运用Alert类来实现错误提醒功能,具体实现参见【例3-7】。

【例3-7】 在运行界面中输入一个字符串,如果是6位就显示正确信息,否则显示错误信息。

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class AlertMidlet extends MIDlet implements CommandListener{
    private TextBox textBox;
    private Command okCommand = new Command("OK", Command.OK, 1);
    private Command exitCommand = new Command("EXIT", Command.EXIT, 1);
    private Display display;
    public AlertMidlet() {
       //Create an exclusive list
    textBox=new TextBox("Type in a 6-character word","",20,TextField.ANY);
    textBox.addCommand(okCommand);
    textBox.addCommand(exitCommand);
    textBox.setCommandListener(this);
    //Retrieve display object
    display=Display.getDisplay(this);
       }
    public void startApp() throws MIDletStateChangeException {
        display.setCurrent(textBox);
    }
    /**
     * Pause the MIDlet
     */
    public void pauseApp() {
    }
    /**
     * Called by the framework before the application is unloaded
     */
    public void destroyApp(boolean unconditional) {
        textBox=null;
        okCommand = null;
        exitCommand = null;
        display=null;
    }
    public void commandAction(Command c, Displayable d) {
        if(d==textBox && c==okCommand) {
            String t=textBox.getString();
            if(t.length()==6) {
                Alert info= new Alert("Success",
                                    "Good word. Try again.",
                                    null,
                                    AlertType.INFO);
                info.setTimeout(Alert.FOREVER);
                display.setCurrent(info,textBox);
            }
            else {
                Image err_img= null;
                //Create error image
                try {
                   err_img=Image.createImage("/error.png");
                }catch(Exception e){
                   System.out.println("image is not created.");
                }
                Alert error= new Alert("Error",
                                    "Sorry not right. Try again.",
                                    err_img,
                                    AlertType.ERROR);
                error.setTimeout(Alert.FOREVER);
                display.setCurrent(error,textBox);
            }
    }
    else if(c==exitCommand) {
        destroyApp(true);
        notifyDestroyed();
        }
    }
}

执行效果如图3-13所示。

图3-13 Alert信息提醒效果图