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信息提醒效果图