为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

3g游戏开发-用户界面开发

2017-11-17 50页 doc 271KB 10阅读

用户头像

is_083599

暂无简介

举报
3g游戏开发-用户界面开发3g游戏开发-用户界面开发 Display Display 1.1 Jave ME Java ME应用程序的高级用户界面一般都是由Display对象和Displayable对象组成,其中,Display类可以用于管理系统的输入的输入设备和显示设备。Displayable对象是一个可以被设置在Display上的对象。 1.2 Display 该类位于javax.microedition.lcdui.Display。 每个MIDlet只能有Display对象,应用程序可以通过调用静态成员函数getDisplay获得对...
3g游戏开发-用户界面开发
3g游戏开发-用户界面开发 Display Display 1.1 Jave ME Java ME应用程序的高级用户界面一般都是由Display对象和Displayable对象组成,其中,Display类可以用于管理系统的输入的输入设备和显示设备。Displayable对象是一个可以被设置在Display上的对象。 1.2 Display 该类位于javax.microedition.lcdui.Display。 每个MIDlet只能有Display对象,应用程序可以通过调用静态成员函数getDisplay获得对Display对象的引用。在MIDlet的运行过程中,无论何时调用getDisplay函数,都会返回相同的Display对象的引用。getDisplay函数的语法定义如下: public static Display getDisplay(MIDlet m); 参数m用于制定返回哪个MIDlet对象的Display对象引用,如果参数为null,则触发空指针异常NullPointerException。 Display 1、返回当前屏幕的Displayable对象方法为: public Displayable getCurrent(); 2、使Displayable在前台运行方法为: public void setCurrent(Displayable nextDisplayable) nextDisplayable参数是要被显示的Displayable对象,如果其值为null,那么,不会对当前显示产生任何影响,即当前显示不变。因此,应该设置一个非空的Displayable对象,向手机中的应用程序管理器发送一个应用程序在前台运行的请求。应用程序没有默认 的Displayable对象,因此在应用程序初始化时,用户要通过setCurrent函数设置应用程序第一个被显示的界面。 Display可以获得边框类型和最佳图像大小。 1、通过Display的getBorderStyle函数返回系统采用的边框类型,语法定义: public int getBorderStyle(Boolean highlighted) 参数为true,则示返回高亮状态的边框类型。 返回值为边框类型,可能有下面两个值之一: Graphics.DOTTED:虚线类型 Graphics.SOLID:实线类型 2、通过Display的getBestImageWidth(int imagetype)、getBestImageHeight(int imagetype)获得图像的最佳宽度和高度 public int getBestImageWidth(int imageType) public int getBestImageHeight(int imageType) 参数imageType是要返回最佳图像大小的组件类型,可以选择的参数值有以下几种: 1、LIST_ELEMENT:image类型为List的选项图像 2、CHOICE_GROUP_ELEMENT:Image类型为ChoiceGroup的选项图像 3、ALERT:Image类型Alert的图像 可以获得系统颜色属性。 numColors():获得当前设备支持的最大颜色数; isColor():是否支持彩色显示; Alpha级别numAlphaLevels():显示当前设备能支持的; getColor(Display.COLOR_BACKGROUND):显示背景颜色; getColor(Display.COLOR_FOREGROUND):显示前景颜色; getColor(Display.COLOR_BORDER):显示边框颜色; getColor(Display.COLOR_HIGHLIGHTED_BACKGROUND):高亮的背景颜色; getColor(Display.COLOR_HIGHLIGHTED_FOREGROUND):高亮的前景颜色; getColor(Display.COLOR_HIGHLIGHTED_BORDER):高亮的边框颜色; 程序4~1 说明:本程序演示如何获得系统颜色属性 import javax.microedition.lcdui.Display; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class DisplayColor extends MIDlet { private Display display; public DisplayColor() { super(); } protected void startApp() throws MIDletStateChangeException { //获得当前MIDlet的Display对象 display = Display.getDisplay(this); //numColor()获取当前设备支持的最大颜色数 System.out.println("Max Colors: " + display.numColors()); //显示是否支持彩色显示 System.out.println("Color Phone: " + display.isColor()); //显示当前设备能支持的Alpha级别 System.out.println("Alpha Level: " + display.numAlphaLevels()); //显示颜色常量的RGB值 //背景颜色 int c = display.getColor(Display.COLOR_BACKGROUND); String color = Integer.toHexString(c).toUpperCase(); System.out.println("Background: " + color); //前景颜色 c = display.getColor(Display.COLOR_FOREGROUND); color = Integer.toHexString(c).toUpperCase(); System.out.println("foreground: " + color); //边框颜色 c = display.getColor(Display.COLOR_BORDER); color = Integer.toHexString(c).toUpperCase(); System.out.println("Border: " + color); //高亮的背景颜色 c= display.getColor(Display.COLOR_HIGHLIGHTED_BACKGROUND); color = Integer.toHexString(c).toUpperCase(); System.out.println("Highlighted Background: " + color); //高亮的前景颜色 c= display.getColor(Display.COLOR_HIGHLIGHTED_FOREGROUND); color = Integer.toHexString(c).toUpperCase(); System.out.println("Highlighted Foreground: " + color); //高亮的边框颜色 c = display.getColor(Display.COLOR_HIGHLIGHTED_BORDER); color = Integer.toHexString(c).toUpperCase(); System.out.println("Highlighted Border: " + color); } protected void pauseApp() { // TODO Auto-generated method stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } } 运行界面: Max Colors: 4096 Color Phone: true Alpha Level: 256 Background: FFFFFF foreground: 0 Border: AFAFAF Highlighted Background: 0 Highlighted Foreground: FFFFFF Highlighted Border: 606060 注意: 1、numColor():该函数的返回值与isColor函数的返回值相关。当isColor函数返回的值为true时,numColors函数的返回值表示当前显示设备所支持的最大彩色数;当isColor函数 返回flase时,numColor函数返回值表示当前显示设备所支持的最大灰度等级。对于黑白 手机,其返回值为2。 2、numAlphaLevels:该函数返回显示设备支持的透明等级。返回2,那么设置支持全透明或不透明。如果返回值大于2,则表示为透明的等级,有可能半透明。 3、public int getColor(int colorSpecifier):该参数colorSpecifier是颜色系统颜色常量的表示,返回值以0x00RRGGBB的表示系统颜色的RGB值。在MIDP2。0规范中,有以下几个颜色常量的表示可以使用。 COLOR_BACKGROUND:常量值为0,表示屏幕上没有高亮显示的背景颜色 COLOR_BORDER:常量值为4,表示屏幕上没有高亮显示的边框颜色,通常和背景颜色 一起使用 COLOR_FOREGROUND:常量值为1,表示屏幕上没有高亮显示的前景色 COLOR_HIGHLIGHTED_BORDER:常量值为5,表示屏幕上被高亮显示的边框颜色 COLOR_HIGHLIGHTED_FOREGROUND:常量值为3,表示用于绘制一个高亮的文本或 简单图形的颜色 1.3 DisplayableScreen Displayable类可以在手机屏幕上显示,一个MIDlet只可能有一个Display,可以有多个Displayable对象,但是在同一时刻只能显示一个Displayable对象。 其直接子类有:Canvas /Screen Displayable 类中提供的成员函数 public void setTitle(String s):设置标题; public void setTicker(Ticker ticker):为Displayable对象设置滚动条; public Ticker getTicker():返回Displayable对象的滚动条; public Boolean isShown():判断当前Displayable对象是否被显示; public addCommand(Command cmd):为Displayable添加一个命令按钮; public void removeCommand(Command cmd):从Displayable中删除一个命令按钮; public void setCommandListener(CommandListener 1):设置命令按钮监听器; public int getWidth():;返回对象的宽度; public int getHeight();返回对象的高度; protected void sizeChanged(int w,int h),只能在派生类中使用,当Displayable对象的大小改变时,将触发sizeChanged函数执行。 1.4 1.4.1 Command 该类位于:javax.microedition.lcdui.Command; 该类直接继承Object对象。构造函数: 1)命令按钮的第一个构造函数 public Command(String label,int commandType,int priority) 参数说明: label:命令按钮上显示的标签 CommandType:是命令按钮的类型,可以使用的类型有: Command.SCREEN、Command.BACK、Command.CANCEL、Command.OK 、 Command.HELP 、Command.ITEM、Command.STOP 、Command.EXIT。 Priority:命令按钮的优先级,即命令按钮的重要性。 程序4~2: 说明:本程序演示命令按钮的使用。 import javax.microedition.lcdui.Command; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Form; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class T extends MIDlet { public T() { // TODO Auto-generated constructor stub } Display display; Form frmMain = new Form("命令按钮长标签演示");//创建表单,设置标题 Command cmdScreen1 = new Command("SCREEN1", Command.SCREEN, 1);//创建命令按钮,名称为cmdScreen1 Command cmdScreen2 = new Command("SCREEN2 ", Command.SCREEN, 2); //创建命令按钮,名称为cmdScreen2 protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); frmMain.addCommand(cmdScreen1);//通过addCommand方法将cmdScreen1 加到表单中 frmMain.addCommand(cmdScreen2); //通过addCommand方法将cmdScreen2 加到表单中 display.setCurrent(frmMain);//将frmMain设置为当前显示 } protected void pauseApp() { // TODO Auto-generated method stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } } 运行界面: 图4.1 2)命令按钮的另外一个构造函数定义如下: public Command(String label,int commandType,int priority) 实际上,每个按钮都有短标签和长标签两个标签,两个标签都可以为空,长标签可以 被显示时(有足够的空间显示长标签),命令按钮首先显示长标签;当没有足够的空间显 示长标签时,系统将选择显示短标签。参数commandType 和priority和第一种构造函数相同。命令按钮的短标签可以通过getLabel函数返回,长标签可以通过getLongLabel函 数返回。 程序4~3 说明:本程序演示长标签和短标签的使用 public class LongLabel extends MIDlet { Display display; Form frmMain = new Form("命令按钮长标签演示"); Command cmdScreen1 = new Command("SCREEN1","This is a short label!", Command.SCREEN, 1); //有足够的空间显示长标签,则显示长标签 Command cmdScreen2 = new Command("SCREEN2", "This is a very vary very vary very vary long label!", Command.SCREEN, 2); //没有足够的空间显示长标签,则显示短标签 Command cmdScreen3 = new Command("A Short Lable", Command.SCREEN, 3); Command cmdExit1 = new Command("EXIT1", Command.EXIT, 1); public LongLabel() { super(); } protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); frmMain.addCommand(cmdScreen3); frmMain.addCommand(cmdScreen2); frmMain.addCommand(cmdScreen1); frmMain.addCommand(cmdExit1); display.setCurrent(frmMain); } protected void pauseApp() { } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { } } 运行效果 图4.2 注意:不同的手机生产厂商之间,以及同一手机生产厂商的不同模拟器之间都存在着一定 的不同。 1.4.2 CommandType 在创建命令按钮时,可以通过commandType参数设置命令按钮的类型,命令按钮 的类型可以getCommandType函数返回。在MIDP2.0规范中定义了如表4-1所示的几种命令按钮类型。 4.1 类型 常量值 使用方法 BACK 2 通常用于在多个屏幕之间进行导航,返回上一个屏幕的 功能不会自动实现,需要开发人员通过代码进行控制 CANCEL 3 可以被用在对话框中,用于提供一个否定的回答,取消 某些操作,通常用于和OK类型一起使用。该类型的按 钮并没有提供取消操作的代码,开发人员需要根据实际 情况自己添加处理代码。当有多个屏幕时,CANCEL 类型命令可以用来取消当前屏幕上的一些操作,并返回 上一个屏幕,该功能和BACK类似,但是CANCEL更 强调取消了某种操作 EXIT 7 用于退出当前应用, 退出代码需要开发人员自己添加 HELP 5 用于提供在线帮助,具体的帮助需要开发人员自己 实现 ITEM 8 可以提示其实现是屏幕的一个条目或者是Choice组件 的一个元素,相对于SCREEN类型而言,ITEM类型 表示命令按钮是屏幕布局的一个部分 OK 4 可以被用在对话框中,用于提供一个肯定的回答,确认 某些操作,通常和CANCEL类型一起使用。该类型的 按钮并没有提供确定以后的操作,开发人员需要根据实 际情况自己添加处理代码。当有多个屏幕时,OK类型 命令可以用来确定在这个屏幕上输入的数据并跳转到 下一个屏幕 SCREEN 1 当要执行的命令适合于整个屏幕,例如“保存”、“打开” 功能,或者用于进行屏幕切换时,可以使用该类型,想 对于ITEM类型而言,SCREEN类型表示命令按钮是 屏幕的一个部分 STOP 6 可以用于停止某些正在运行的操作,进程等,通常不许 要进行屏幕切换,停止操作的代码需要开发人员自己完 成 程序4~4 说明:本程序演示命令按钮类型对命令按钮位置及顺序的影响。 public class CommandType extends MIDlet { Display display; Form frmMain = new Form("命令按钮类型演示"); //命令按钮 Command cmdScreen1 = new Command("SCREEN1", Command.SCREEN, 1); Command cmdScreen2 = new Command("SCREEN2", Command.SCREEN, 1); Command cmdItem1 = new Command("ITEM1", Command.ITEM, 1); Command cmdItem2 = new Command("ITEM2", Command.ITEM, 1); Command cmdExit2 = new Command("EXIT2", Command.EXIT, 1); Command cmdExit1 = new Command("EXIT1", Command.EXIT, 1); Command cmdBack1 = new Command("BACK1", Command.BACK, 1); Command cmdBack2 = new Command("BACK2", Command.BACK, 1); Command cmdCancel1 = new Command("CANCEL1", Command.CANCEL, 1); Command cmdCancel2 = new Command("CANCEL2", Command.CANCEL, 1); Command cmdHelp1 = new Command("HELP1", Command.HELP, 1); Command cmdHelp2 = new Command("HELP2", Command.HELP, 1); Command cmdOk1 = new Command("OK1", Command.OK, 1); Command cmdOk2 = new Command("OK2", Command.OK, 1); Command cmdStop1 = new Command("STOP1", Command.STOP, 1); Command cmdStop2 = new Command("STOP2", Command.STOP, 1); public CommandType() { super(); // TODO Auto-generated constructor stub } protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); frmMain.addCommand(cmdBack1); frmMain.addCommand(cmdCancel1); frmMain.addCommand(cmdHelp1); frmMain.addCommand(cmdOk1); frmMain.addCommand(cmdStop1); frmMain.addCommand(cmdScreen1); frmMain.addCommand(cmdItem1); frmMain.addCommand(cmdBack2); frmMain.addCommand(cmdCancel2); frmMain.addCommand(cmdHelp2); frmMain.addCommand(cmdOk2); frmMain.addCommand(cmdStop2); frmMain.addCommand(cmdExit1); frmMain.addCommand(cmdExit2); frmMain.addCommand(cmdScreen2); frmMain.addCommand(cmdItem2); display.setCurrent(frmMain); } protected void pauseApp() { // TODO Auto-generated method stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } } 运行界面: 图4.3 注意:1、对于具有两个软键的手机,命令按钮区域被划分成两个部分,左边的部分被绑 定到左软键,右边的部分被绑定到右软键; 2、对于具有三个软键的手机,命令按钮区域被划分成3个部分,左边的部分被绑定到左软键,中间的部分被绑定到中软键,右边的部分被绑定到右软件; 3、当命令按钮多余2个或3个时,则其他命令按钮被折叠成一个“选项菜单”。 1.5 WTK 在WTK模拟器中,BACK、EXIT、CANCEL、STOP类型的命令按钮会尽量占据命 令按钮区的左边区域(左软键),这四种类型按钮占据左软键的优先级如表4.2: 4.2 WTK 命令按钮类型 占据左软键的优先级 BACK 1 CANCEL 3 EXIT 2 STOP 4 在WTK中,ITEM、SCREEN、OK、HELP这四种类型无论如何都会在命令按钮区 的右边显示。这四种类型按钮占据左软键的优先级如表4.3: 4.3 WTK 命令按钮类型 占据左软键的优先级 ITEM 1 SCREEN 2 OK 3 HELP 4 BACK 5 EXIT 6 CANCEL 7 STOP 8 注意:命令按钮出现的顺序,由其类型决定,但是,同一类型的按钮出现的顺序,可以通 过设置priority 程序4~5: 说明:本程序演示按钮优先级对命令出现顺序的影响。 package test; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Form; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class CommandPriority extends MIDlet { Display display; Form frmMain = new Form("命令按钮优先级演示"); //命令按钮 Command cmdScreen1 = new Command("SCREEN1", Command.SCREEN, 1); Command cmdScreen2 = new Command("SCREEN2", Command.SCREEN, 2); Command cmdScreen3 = new Command("SCREEN3", Command.SCREEN, 3); Command cmdItem1 = new Command("ITEM1", Command.ITEM, 1); Command cmdItem2 = new Command("ITEM2", Command.ITEM, 1); Command cmdItem3 = new Command("ITEM3", Command.ITEM, 1); Command cmdExit2 = new Command("EXIT2", Command.EXIT, 1); Command cmdExit1 = new Command("EXIT1", Command.EXIT, 2); public CommandPriority() { super(); // TODO Auto-generated constructor stub } //同等级别的命令按钮,Priority决定重要程度,越小的重要程度越大,出现位置越靠前 protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); frmMain.addCommand(cmdScreen3); frmMain.addCommand(cmdScreen2); frmMain.addCommand(cmdScreen1); frmMain.addCommand(cmdItem3); frmMain.addCommand(cmdItem2); frmMain.addCommand(cmdItem1); frmMain.addCommand(cmdExit1); frmMain.addCommand(cmdExit2); display.setCurrent(frmMain); } protected void pauseApp() { // TODO Auto-generated method stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } } 运行界面: 图4.4 1.6 命令按钮的主要功能就是处理用户的操作,当用户按下某个键时,跟这个键相关的命 令按钮就会收到这个按键事件。如果这个命令按钮注册了监听器(CommandListener), 那么这个事件就会被传送到监听器中进行处理。命令按钮的动作监听器为 CommandListener接口,包含在 javax.microedition.lcdui.CommandListener; 命令按钮监听器只有一个的方法 public void commandAction(Command c,Displayable d) 说明:参数 c是被按下的命令按钮,参数d是包含命令按钮c的Displayable显示对象 程序4~6: 说明:本程序演示命令按钮事件处理的一般方法。 public class TestListener extends MIDlet implements CommandListener { public Display display; public Form frmMain = new Form("退出按钮监听测试"); Command command1 = new Command("增加",Command.HELP,1); public TestListener() { // TODO Auto-generated constructor stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub display = Display.getDisplay(this); frmMain.addCommand(command1); frmMain.setCommandListener(this); display.setCurrent(frmMain); } public void commandAction(Command c, Displayable d) { // TODO Auto-generated method stub if(c == command1){ frmMain.append("hello"); } } } 运行界面: 图4.5 注意:在CommandActionHandle中必须实现commandAction函数,用于处理命令按钮事件。 1.7 TextBox TextBox可以允许用户输入姓名、电话号码、电子邮件地址、密码等文本信息,通常可 以作为一个文本编辑器使用。 1.7.1 TextBox TextBox类继承于Screen。在MIDP2.0规范中,TextField也可以用于文本输入,与TextBox 类似,但是TextField通常被添加到表单Form 中使用,而TextBox可以单独作 为一个屏幕显示。 构造函数: public TextBox(String title,String text,int maxSize,int comstraints) 其中: 1、title是TextBox的标题 2、text是TextBox内初始化字符串 3、maxSize用于指定TextBox中的最大可容纳的字符数。如果maxSize设置的值小于或 等于0,或text的字符数超过了maxSize定义,都会引发java.lang.IllegalArgumentException异常。用户输入的文本超过该值,则超过的文本将不 被接受,引发java.lang.IllegalArgumentException异常。 4、comstraints用于指定输入的约束,例如只接受数字0~9。该参数必须为TextField类 中定义的几个输入约束类型,否则会产生java.lang.IllegalArgumentException异常。 TextField.ANY表示接受任何类型的数据。 程序4~7: 说明:本程序演示使用TextBox输入文本。 package test; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.TextBox; import javax.microedition.lcdui.TextField; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class BoxTest extends MIDlet{ public Display display; public TextBox tb = new TextBox("编辑消息","请输入消息",100,TextField.ANY); public BoxTest() { // TODO Auto-generated constructor stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub display = Display.getDisplay(this); display.setCurrent(tb); } } 运行界面: 图4.6 注意:1、不同的手机设备中TextBox的显示不相同。 2、TextBox的最大字符数不是越大越好,设置过大的字符数可能占用更多的系统 资源。 1.7.2 1 TextBox中的文本,可以在创建TextBox对象时设置,也可以在创建了TextBox对象 后,通过setString函数或setChars函数设置。语法定义如下: 程序4~8: 说明:演示文本替换。 protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub display = Display.getDisplay(this); tb.setString("我们改变TextBox的默认字符串"); display.setCurrent(tb); } public void setString(String text) text是新的字符串 public void setChars(char[] data,int offset,int length) data是一个字符数组。参数offset是要插入的内容在字符数组中的起始位置。Length是 要插入的内容在字符数组data中从起始位置offset开始的长度。 程序4~9 说明:本程序演示字符。 protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub display = Display.getDisplay(this); String str = "我们用字符数组函数改变TextBox的默认字符串"; tb.setChars(str.toCharArray(), 0, 15); display.setCurrent(tb); } 2、获得用户输入 TextBox的文本可以通过getString函数或者getChars函数返回。 getString函数把TextBox的文本内容作为字符串返回; getChars函数通过参数字符数组返回。 程序4~10: 说明:本程序演示用字符串函数改变TextBox的默认字符串。 protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub display = Display.getDisplay(this); tb.setString("我们用字符串函数改变TextBox的默认字符串"); tb.setChars(tb.getString().toCharArray(), 0, 10); display.setCurrent(tb); //获得用户输入 int size = tb.size(); char[] data = null; if(size > 0){ data = new char[size]; tb.getChars(data); } System.out.println(data); } 注意:1、data不能为空,否则引发NullPointerException异常 2、data的长度不能小于文本内容,否则引发ArrayIndexOutOfBoundsException异常 运行界面: 在控制台输出:“我们用字符串函数改变”。 3、插入文本 TextBox提供了两个insert函数,用于插入字符串。其语法定义如下: 第一个insert函数: public void insert(char[] data,int offset,int length,int position); Data包含了要插入的字符/字符串,该参数不能为null,否则引发 NullPointerException; offset表示被插入内容在字符数组data中的起始位置。 length是字符数组data中起始位置开始要被插入的字符数。Offset和length都必须 有效,否则会引发,IllegalArgumentException。 position表示插入字符的位置。 第二个insert函数: public void insert(String src,int position); 参数src是要被插入的字符串; position表示插入字符的位置。 程序4~11: 说明:本程序演示插入文本。 protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub display = Display.getDisplay(this); tb.setString("我们用字符串函数改变TextBox的默认字符串"); tb.setChars(tb.getString().toCharArray(), 0, tb.size()); System.out.println(tb.size()); String str = "在第三个字符处插入的文本:)"; tb.insert(str, tb.size()-1); System.out.println(tb.size()); tb.insert(tb.getString().toCharArray(), 0,tb.size(), tb.size()); System.out.println(tb.size()); display.setCurrent(tb); //获得用户输入 int size = tb.size(); char[] data = null; if(size > 0){ data = new char[size]; tb.getChars(data); } System.out.println(data); } 4、删除文本 删除文本可以通过deltete函数实现,其语法定义如下 public void delete(int offset,int length); 程序4~12: 说明:本程序演示先插入文本,再删除文本中的内容。 protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub display = Display.getDisplay(this); tb.setString("我们用字符串函数改变TextBox的默认字符串"); tb.setChars(tb.getString().toCharArray(), 0, tb.size()); System.out.println(tb.size()); String str = "在第三个字符处插入的文本:)"; tb.insert(str, tb.size()-1); System.out.println(tb.size()); tb.insert(tb.getString().toCharArray(), 0,tb.size(), tb.size()); System.out.println(tb.size()); System.out.println("光标的位置:"+tb.getCaretPosition()); tb.delete(5, 9); display.setCurrent(tb); } 参数offset表示要被删除内容的起始位置,参数length是从起始位置开始要被删除的字符数。 1.8 getCaretPosition函数可以返回光标的位置。 程序4~13 说明:本程序演示了光标在不同模拟器和设备中的差异 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class TextEditor extends MIDlet implements CommandListener { //Display管理 Display display = null; //TextBox对象 TextBox tbMain = new TextBox("Text Editor", //设置标题 "", //设置内容 255, //设置最大字符数255 TextField.ANY); //可以接受任何输入 //创建命令按钮 //插入 Command cmdInsertFirst = new Command("Insert at start", Command.SCREEN,1); Command cmdInsertCurrent = new Command("Insert at current", Command.SCREEN,1); //删除 Command cmdDeleteFirstChar = new Command("Delete First char", Command.SCREEN,1); Command cmdDeleteLastChar = new Command("Delete Last char", Command.SCREEN,1); Command cmdDeletePreviousChar = new Command("Delete previous char", Command.SCREEN,1); //替换 Command cmdReplace = new Command("Replace", Command.SCREEN,1); //显示光标位置 Command cmdCaret = new Command("Caret Position", Command.SCREEN,1); Command cmdExit = new Command("Exit", Command.EXIT, 2); //用于插入数字的计数器 int count = 0; public void startApp() { //设置Displayable对象 tbMain.setInitialInputMode("MIDP_UPPERCASE_LATIN"); tbMain.addCommand(cmdExit); tbMain.addCommand(cmdCaret); tbMain.addCommand(cmdInsertFirst); tbMain.addCommand(cmdInsertCurrent); tbMain.addCommand(cmdDeleteFirstChar); tbMain.addCommand(cmdDeleteLastChar); tbMain.addCommand(cmdDeletePreviousChar); tbMain.addCommand(cmdReplace); tbMain.setCommandListener(this); //获得当前MIDlet的Display对象 display = Display.getDisplay(this); //设置TextBox对象为当前显示对象 display.setCurrent(tbMain); } public void pauseApp() { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } /** * 处理命令按钮事件 */ public void commandAction(Command c, Displayable d) { if (c == this.cmdExit) { destroyApp(true); notifyDestroyed(); } else if(c == this.cmdCaret) { //光标位置 int caret = tbMain.getCaretPosition(); System.out.println("\n\nCaret Position: "+caret); tbMain.setTitle("Caret Position: " + String.valueOf(caret)); } else if(c == this.cmdInsertFirst) { //在开始处插入一个字符 String str = Integer.toString(count++); tbMain.insert(str, 0); } else if (c == this.cmdInsertCurrent) { //在当前位置插入字符 String str = Integer.toString(count++); int caret = tbMain.getCaretPosition(); System.out.println("Caret Position:"+caret); System.out.println("Insert:"+str); tbMain.insert(str, caret); } else if(c == this.cmdReplace) { //替换 String str = Integer.toString(count++); tbMain.setChars(str.toCharArray(), 0, str.length()); }else if(c == this.cmdDeleteFirstChar) { //删除第一个字符 int size = tbMain.size(); if (size>0) { //当没有字符时不能执行该功能 tbMain.delete(0, 1); } } else if(c == this.cmdDeleteLastChar) { //删除最后一个字符 int size = tbMain.size(); if (size>0) { //当没有字符时不能执行该功能 tbMain.delete(size-1, 1); } } else if(c == this.cmdDeletePreviousChar) { //删除前一个字符 int caret = tbMain.getCaretPosition(); if (caret > 0) { tbMain.delete(caret-1, 1); } } } } 运行界面 图4.7 注意:1、变量count是计算器,当前计数值将被插入到TextBox中。 2、在NokiaS40和S60中,首先输入一些字符串,如:“ABCD”,在将光标移动到第一个和第二个字符之间,选择Caret Position命令按钮,如果光标移动,则将光标重 新移动到第一个和第二个字符之间,选择Insert at current命令按钮。 3、按照2中的步骤执行,在WTK中没有正确的返回光标位置。 1.9 Ticker 滚动条是一段不停地连续滚动的文字,滚动条的滚动速度和滚动方向有手机的具体实 现决定。MIDP2.0规范中提供了Ticker类,封装了滚动条功能。Ticker类的构造函数语 法定义如下 public Ticker(String str); 注意:1、str是滚动的内容,且只能显示一行文本。 2、创建Ticker对象后,滚动条不会自动出现在屏幕上,需要使用setTicker函数 进行设置。 语法: public void setTicker(Ticker ticker) 值为null,则删除当前滚动条,在程序中可以取消滚动条,但是不能停止滚动条。 setTicker函数是Displayable类的公有成员函数,因此在其子类中都可以设置滚动条,例如Alert、From、List、TextBox等。通过getTicker函数可以返回当前屏幕的Ticker对象。 程序4~14 说明:演示滚动条的使用方法。 public class TickerDemo extends MIDlet implements CommandListener { //Display管理 Display display = null; //TextBox对象 TextBox tbMain = new TextBox("Ticker Demo", "", 255, TextField.ANY); //Ticker对象 Ticker ticker = new Ticker("This is the scrolling text"); //创建命令按钮 private Command cmdAddTicker = new Command("Add Ticker", Command.SCREEN,1); private Command cmdRemoveTicker = new Command("Remove Ticker", Command.SCREEN,1); private Command cmdSetTickerText = new Command("Set Ticker Text", Command.SCREEN,1); private Command cmdGetTickerText = new Command("Get Ticker Text", Command.SCREEN,1); private Command cmdExit = new Command("Exit", Command.EXIT, 2); //计数器 int count = 1; public TickerDemo() { super(); // TODO Auto-generated constructor stub } protected void startApp() throws MIDletStateChangeException { //设置Displayable对象 tbMain.addCommand(cmdExit); tbMain.addCommand(cmdAddTicker); tbMain.addCommand(cmdRemoveTicker); tbMain.addCommand(cmdSetTickerText); tbMain.addCommand(cmdGetTickerText); tbMain.setCommandListener(this); //获得当前MIDlet的Display对象 display = Display.getDisplay(this); //设置TextBox对象为当前显示对象 display.setCurrent(tbMain); } protected void pauseApp() { // TODO Auto-generated method stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } /** * 处理命令按钮事件 */ public void commandAction(Command c, Displayable d) { if (c == this.cmdExit) { notifyDestroyed(); } else if(c == this.cmdAddTicker) { //显示滚动条 tbMain.setTicker(ticker); } else if(c == this.cmdRemoveTicker) { //删除滚动条 tbMain.setTicker(null); } else if(c == this.cmdSetTickerText) { ticker.setString(ticker.getString() + "\n" + "第" + ++count + "行滚动文字"); } else if(c == this.cmdGetTickerText) { tbMain.setString(tbMain.getTicker().getString()); } } } 运行界面: 图4.8 1.10 可以通过List类实现列表窗口。List包含在javax.microedition.lcdui 包中,父类为Screen。 1.10.1 列表窗口包括一些选项,这些选项的类型可以分为隐式类型、单选类型、多选类型. List类的构造函数有两个: 构造函数一: public List(String title,int listType) Title是空列表的标题。 listType是列表选项的类型或称列表的类型。有三种类型: IMPLICIT(互斥的,通过隐式按钮实现),EXCLUSIVE(单选)和MULTIPLE(多选)。 构造函数二: public List(String title, int listType,String[] stringElements,Image[] imageElements) StringElements是字符串数组,可以指定具体的列表选项。 imageElements可以指定具体的列表选项以及列表选项的图标。 程序4~15 说明:演示List的用法。 package test; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.List; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class ListImplicitTest extends MIDlet { Display display; String ima[] ={"已拨电话","未接来电"}; Command command1; Command command2; Command command3; List list; public ListImplicitTest () { // TODO Auto-generated constructor stub command1 = new Command("确定",Command.OK,1); command2 = new Command("退出",Command.EXIT,1); command3 = new Command("返回",Command.BACK,1); list = new List("通讯纪录",List.IMPLICIT,ima,null); } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } protected void pauseApp() { // TODO Auto-generated method stub } protected void startApp() throws MIDletStateChangeException { list.addCommand(command1); display = Display.getDisplay(this); display.setCurrent(list); } } 运行界面: 图4.9 1.11 EXCLUSIVE 常量List.EXCLUSIVE,表示单选按钮。 程序4~16 说明:本程序演示了单选按钮的使用。 public ListImplicitTest () { // TODO Auto-generated constructor stub command1 = new Command("确定",Command.OK,1); command2 = new Command("退出",Command.EXIT,1); command3 = new Command("返回",Command.BACK,1); list = new List("hello", List.EXCLUSIVE,ima,null); } 运行界面 图4.10 1.12 MULTIPLE 程序4~17 说明:本程序演示多选按钮的使用方法,常量List.EXCLUSIVE public ListImplicitTest () { // TODO Auto-generated constructor stub command1 = new Command("确定",Command.OK,1); command2 = new Command("退出",Command.EXIT,1); command3 = new Command("返回",Command.BACK,1); list = new List("hello", List.EXCLUSIVE,ima,null); } 运行界面 图4.11 1.13 1、 隐式类型的列表窗口 在隐式类型的列表窗口中选项的选择是隐式进行的。用户可以在命令按钮事件的处理 函数中可以获得被选中的选项。在List类中提供了一个静态成员命令常量 SELECT_COMMAND,该命令按钮是作为默认的隐式命令按钮,当用户按下选择键后 会触发该命令按钮的动作。 public static final Command SELECT_COMMAND SELECT_COMMAND命令按钮的标签为空;优先级为0;类型为SCREEN或ITEM。 程序4~18 说明:本程序演示了隐式类型的列表窗口中获取被选中选项的方法。 import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.List; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class SelectImplicitList extends MIDlet implements CommandListener { private Display display; //定义List菜单的内容 private static String menuItems[] = {"List Item1", "List Item2", "List Item3", "List Item4", "List Item5" }; private List lstImplicit = new List( "IMPLICIT List", //标题 List.IMPLICIT, //隐式类型 menuItems, //设置列表内容 null); //列表不使用图标 //Exit private Command cmdExit = new Command("Exit", Command.EXIT, 1); public SelectImplicitList() { super(); // TODO Auto-generated constructor stub } protected void startApp() throws MIDletStateChangeException { //设置命令监听 lstImplicit.addCommand(cmdExit); lstImplicit.setCommandListener(this); //获得当前MIDlet的Display对象 display = Display.getDisplay(this); //设置List对象为当前显示对象 display.setCurrent(lstImplicit); } protected void pauseApp() { // TODO Auto-generated method stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } /** * 处理命令按钮事件 */ public void commandAction(Command c, Displayable d) { if (c == List.SELECT_COMMAND) { //获得被选中选项的索引 int index = this.lstImplicit.getSelectedIndex(); //获得被选中选择的内容 String str = this.lstImplicit.getString(index); //显示在标题中 this.lstImplicit.setTitle("Item: '" + str + "' is selected"); } else if (c == this.cmdExit) { notifyDestroyed(); } } } MIDlet实现了CommandListener接口,用于处理隐式命令按钮事件。在创建隐式类型列表后,要通过setCommandListener函数设置命令按钮事件监听。当用户在界面上按下选择键后,会触发隐式命令按钮SELECT_COMMAND的动作,在commandAction函 数中可以捕捉到该事件进行处理。通过List类的成员getSelectIndex可以返回被选种选项 的索引,然后通过getString函数返回被选种选项的内容getString函数的语法定义如下: public String getString(int elementNum) 其中,elementNum是要返回内容的选项索引。如果参数elementNum小于0或者 大于实际选项的个数,则会引发IndexOutOfBoundsException异常。获得被选中选项的 内容后,通过setTitle函数显示在列表的标题中。 程序4~19 protected void startApp() throws MIDletStateChangeException { list.addCommand(command1); list.addCommand(command2); list.setSelectCommand(null); list.setCommandListener(this); display = Display.getDisplay(this); display.setCurrent(list); } 注意: 1、如果用户想自己创建选择命令按钮,可以通过Displayable的setSelectCommand 覆盖默认的隐式命令按钮。其函数语法定语如下 public void setSelectCommand(Command command) 其中,参数command是用户定义的命令按钮,该命令按钮将覆盖 SELECT_COMMAND,如果参数为null,按下选择命令按钮则不会有任何反应。 2、 如果列表窗口的类型不为IMPLICIT,那么调用setSelectCommand函数不会有 任何的作用 3、 多选类型的列列表窗口 获得多选类型列表的值可以使用如下步骤 1) 获得被选中选项的索引。 int index = this.lstImplicit.getSelectedIndex(); 2) 获得被选中选项的内容 Sstring str = this.lstImplicit.getString(index); 3) 显示在标题中 this.lstImplicit.setTitle(“Item:’””+str+”’is selected”); 程序4~20 说明:演示在多选类型的列表窗口中被选中选项的获取方法 import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.List; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class SelectMultipleList extends MIDlet implements CommandListener { private Display display; //定义List菜单的内容 private static String menuItems[] = {"List Item1", "List Item2", "List Item3", "List Item4", "List Item5" }; private List lstMultiple = new List( "Multiple List", //标题 List.MULTIPLE, //隐式类型 menuItems, //设置列表内容 null); //列表不使用图标 //用于读取选中的选项 private Command cmdRead = new Command("Read", Command.SCREEN, 1); //用于设置被选中的选项 private Command cmdSet = new Command("Set", Command.SCREEN, 1); //全部选中 private Command cmdSelectAll = new Command("Select All", Command.SCREEN, 1); //Exit private Command cmdExit = new Command("Exit", Command.EXIT, 1); public SelectMultipleList() { super(); // TODO Auto-generated constructor stub } protected void startApp() throws MIDletStateChangeException { //设置命令监听 lstMultiple.addCommand(cmdExit); lstMultiple.addCommand(cmdRead); lstMultiple.addCommand(cmdSet); lstMultiple.addCommand(cmdSelectAll); lstMultiple.setCommandListener(this); //获得当前MIDlet的Display对象 display = Display.getDisplay(this); //设置List对象为当前显示对象 display.setCurrent(lstMultiple); } protected void pauseApp() { // TODO Auto-generated method stub } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // TODO Auto-generated method stub } /** * 处理命令按钮事件 */ public void commandAction(Command c, Displayable d) { if (c == this.cmdRead) { //读取选中的选项 - 方法1 System.out.println("读取选中的选项 - 方法1输出内容"); for (int i=0; i< lstMultiple.size(); i++) { if (lstMultiple.isSelected(i)) { String str = lstMultiple.getString(i); System.out.println("Item: '" + str + "' is selected"); } } //读取选中的选项 - 方法2 System.out.println("\n\n读取选中的选项 - 方法2输出内容"); boolean flags[] = new boolean[lstMultiple.size()]; lstMultiple.getSelectedFlags(flags); for (int i=0; i< flags.length; i++) { if (flags[i]) { String str = lstMultiple.getString(i); System.out.println("Item: '" + str + "' is selected"); } } } else if (c == this.cmdSet) { //设置选中的内容 - 方法1 lstMultiple.setSelectedIndex(0, true); lstMultiple.setSelectedIndex(1, true); lstMultiple.setSelectedIndex(2, true); lstMultiple.setSelectedIndex(3, false); lstMultiple.setSelectedIndex(4, false); //设置选中的内容 - 方法2 //boolean flags[] = {true, true, true, false, false}; //lstMultiple.setSelectedFlags(flags); } else if (c == this.cmdSelectAll) { //全选,下面的算法在选项很多时或者无法预先知道选项个数时有意义 boolean flags[] = new boolean[lstMultiple.size()]; for (int i=0;i
/
本文档为【3g游戏开发-用户界面开发】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索