Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5522892
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: Java

2008-10-25 10:31:11

看过一个关于screen的例子后,你应该会问起:你是如何来组织这些screen的?在它们之间是如何导航的?你是如何管理显示及输入设备的?回答是,所有的功能皆由Display类来实现,它提供了相应的方法用于把对象显示在设备的屏幕上以及用于检索设备的属性等。

  1. Display

  一个指向设备的display的引用可以通过提供一个MIDlet引用给静态方法getDisplay()而取得。

public static Display getDisplay(MIDlet c);
This is typically done in the startApp( ) method of a MIDlet, as follows:
public class MyMIDlet extends MIDlet {
 Display display = null;
 public MyMIDlet( ) {}
 public void startApp( ) {
  display = Display.getDisplay(this);
 }
 // 其它方法
}

  提示:在调用MIDlet的startApp( )方法后,应该调用getDisplay( )方法,如前所述。但绝不应该从MIDlet的构造器内调用这个方法,正如每一本MIDP说明书上所述,因为应用程序管理器在这时可能还没有完成它的初始化。

  在你获得一个对设备的显示参考后,只需创建一个用于显示的GUI组件即可。注意在图 5-2所有的GUI组件都实现了抽象类Displayable。你可以传递你产生的GUI组件给Display的两个setCurrent( )方法:

public void setCurrent(Displayable d);
public void setCurrent(Alert alert, Displayable d);

  第二个方法用于显示一个临时的警告信息,后面跟着可显示的GUI元素。后面我们再讨论alert。

  想确定当前在设备上显示的内容,可以使用getCurrent()方法,它返回一个当前正显示的Displayable对象的参考。

public Displayable getCurrent( );

  而且,该Display类(其实际上是设备管理器)还提供方法用于查询display以决定它支持的颜色数目:

public void boolean inColor( );
public int numColors( );

  第一个方法isColor( )返回一个布尔值:true-如果设备支持彩色;false-如果仅支持灰度。numColors( )方法返回设备支持的不同颜色的整数序号。

  2. Screen

  如前所述,在用户和设备之间交互的基本单元是screen,它是一个封装了设备相关图形用户输入接口的对象。如在图1的类图中所见,共有四类高层的screen:TextBox,List,Alert和Form。

Java手机软件图形界面API之screen相关API
图1.包lcdui中的主要类间的类关系图

  然而,Screen仅是一个有其自身一些功能的抽象类。每个Screen可以有两个额外的特性:标题和ticker。标题是显示在screen 内容之上的一个字符串。Ticker是一个图形组件,它显示在标题上方,可用于横向卷动显示给用户的信息。二者皆是可选的,尽管标题串有一个缺省的内容。如果省略了ticker,则一点不显示并把相应的空间让给screen。后面我们要讨论Ticker组件。但是,图 2显示了Screen 对象的标题和ticker 属性之间的相对位置关系。

Java手机软件图形界面API之screen相关API
图 2.屏幕上的标题和ticker

  Screen 类的下列方法可以分别用于设置和检索标题和ticker。

public void setTitle(String title);
public String getTitle( );
public void setTicker(Ticker ticker);
public Ticker getTicker( );

  3. Ticker

  Ticker类可用横跨显示区显示一串连续的文本。它可以依附于一个或多个前面已述的screen上:Alert,TextBox,List和Form。可以用Ticker构造器创建一个ticker对象:

public Ticker(String str);

  你可以用下面方法存取ticker中的文本串:

public String getString( );
public void setString(String s);

  一旦生成一个ticker,就可以用该screen的setTicker( )方法把它依附于该screen。如,下列代码生成一个List screen并把一个ticker依附于它:

Display display = Display.getDisplay( );
List list = new List("Trade Stocks", Choice.EXCLUSIVE);
list.append("Buy", null);
list.append("Sell", null);
list.setTicker(new Ticker("Welcome to my discount broker"));
display.setCurrent(list);

  图 3 显示了ticker的外观,它处于当前显示的List组件的上方。

Java手机软件图形界面API之screen相关API
图 3.一个ticker的例子


  在使用ticker时要注意以下几点:

  ·没有提供启动和停止该ticker的方法函数。

  ·该ticker字符串连续卷动。也就是说,当该字符串在显示屏上显示结束,该ticker接着在该串的起始位置开始显示。在串的结尾加上一些空格可能有助于使得字符串的显示看上去不是连接在一起的。

  ·卷动的方向和速度由MIDP系统的实现来决定。

4. TextBox

  TextBox对象是一个允许用户输入和编辑文本的screen。在MIDlet程序需要用户输入诸如姓名,电话号码,e-mail地址或者口令字时,你可以选用TextBox控件。你可以通过指定四个参数给TextBox的构造器来创建一个TextBox 对象:

public TextBox(String title, String text, int maxSize, int constraints);

  title被复用作该screen的标题,参数text和maxSize用于指定初始(缺省的)文本和该文本框的最大尺寸。最后,constraints参数可用于限制用户的输入。Constraints取值为TextBox类的静态常整型常量,由TextField和TextBox类共享使用,如下:

常量 说明
TextField.ANY 允许用户输入任何字符
TextField.EMAILADDR 必须输入一个e-mail地址
TextField.NUMBER 必须输入一个整型值
TextField.PASSWD 文本以*蒙盖,因此输入的文本是不可见的
TextField.PHONENUMBER 必须输入一个电话号码
TextField.URL 必须输入一个URL地址

  如果你给constraints的指定值不是TextField.ANY,系统将执行校验以确保输入满足要求。

  注意:约束值TextField.PASSWD可以和任何其它约束值值通过OR(|)运算符相结合。如,如果你要产生一个TextBox,并限制输入为电话号码,但又想隐藏输入数据,可以如下创建对象:

TextBox t=new TextBox("Tel","",12,TextField.PHONENUMBER|TextField.PASSWD);

  如果你想检索当前活动的TextBox的约束值,可以如下:

public int getConstraints( );
public void setConstrants(int c);

  另外应该指出的是,一个文本框有一个容量限定(即最大字符数)。但是,每一个MIDP系统实现都将对该最大容量设置一个边界值,它可能比应用程序要求的尺寸要小。系统允许的最大尺寸可以用方法getMaxSize( )来检索,也可应用方法setMaxSize( )来复位。

public int getMaxSize( );
public void setMaxSize(int size);

  一个书写良好的MIDP应用程序应该总是比较它要求的大小和当前的最大值。

  在当前MIDP的来自于Sun Microsystems的参考实现中,getMaxSize( )方法总是返回MIDlet要求的尺寸。但是不要因此而放弃比较的习惯。
你还可以通过使用方法setString( )和getString( )来设置或者检索TextBox对象的完整的文本:

public String getString( );
public void setString(String s);

  另外,如果你要知道输入的字符数,可以用方法size( ):

public int size( );

  你还可以使用下列方法对文本框进行删除,插入,替换等等:

public void delete(int offset, int length);
public void insert(char[] data, int offset, int length, int position);
public void insert(String src, int position);
public void setChars(char[] data, int offset, int length);

  最后,要确定插入点位置,可以用下面方法:

public int getCaretPosition( );

  下面的小例创建一个文本框,标签为"TextBox",初始文本值为"This is a text box",最大尺寸为20个字符,可以输入任何字符。

TextBox tb = new TextBox("TextBox", "This is a textbox", 20, TextField.ANY);
Display display = Display.getDisplay(this);
display.setCurrent(tb);

  如果你写一个完整的MIDlet程序并在模拟器中运行,会看到如图 4所示的效果。注意,如果要显示的文本长于一屏的,系统将允许用户卷动查看并进行编辑-具体依赖于系统的实现。

Java手机软件图形界面API之screen相关API(2)
图 4.display和screen之间的关系

5. Alert

  一个alert是一个显示文本和图像的普通的screen。它通知用户出错及另外一些异常信息。一个alert可以是模式的,也可以是定时的。
一个模式的alert在用户取消它之前一直停留在屏幕上,其时,它可能回到显示它之前的屏幕状态,或者转到一个由应用程序特别选择的屏幕。当你要求用户作出选择时,这是很有用的。如,你可能显示信息如"Are you sure?"并给出选项"Yes"和"No"。注意MIDP系统会自动 提供一种方法以取消一个模式的alert。如,在Sun的实现中,它提供了一个映射到软按钮的Done命令。

  一个定时的alert,则被显示指定(一般为几秒钟)的时间。在显示一条用户可能还不了解的信息时,这是很有用的。例如,你可能要显示如"Your message has been sent"的信息。但是,如果你指定一个定时的alert以一下子显示太长的信息,它会自动转换成一个模式的alert!
你可以用Alert类来创建一个alert:

public Alert(String title);
public Alert(String title,String alertText,Image alertImage,AlertType alertType);

  第一个构造器创建一个定时的alert。注意,这里的定时值并没有指定。然而,alert 将使用默认的timeout值,这个值可以用不可改变的getDefaultTimeout( )方法取得。如果你想要到改变alert的timeout,可以用setTimeout()方法并传入一个整数值以指明以毫秒为单位的timeout值。要获得alert当前的timeout值,可以用getTimeout()方法。

public int getDefaultTimeout( );
public int getTimeout( );
public void setTimeout(int t);

  例如,下列代码创建一个定时的alert,并且其timeout值设置为4秒:

Alert alert = new Alert("title");
alert.setTimeout(4000);

  另外你能传入常量Alert.FOREVER。

alert.setTimeout(Alert.FOREVER);

  你还可以用第二个构造器创建一个更细致的alert。该构造器允许你使用Image 对象在该alert上加上一个图标。而且,一个alert可以有一个类型,以指定这个alert的特性。当这种alert出现在用户面前时,MIDP 实现体可以用这一类型来播放一段合适的音响。AlertType类共提供五种类型的alert:AlertType.ALARM, AlertType.CONFIRMATION, AlertType.ERROR, AlertType.INFO还有AlertType.WARNING。作为一实例,下面的代码段创建一个AlertType.CONFIRMATION类型的alert,其上并不显示图标:

public Alert(String title, String messageString, Image alertImage,lertType alertType);

  如果你想忽略图像,标题,文本或者alert类型的话,你可以把第二个构造器中所有的参数置为null。构造器中每个这些附加的属性在Alert类中都有相应的存取函数:

public Image getImage( );
public String getString( );
public AlertType getType( );
public void setImage(Image img);
public void setString(String str);
public void setType(AlertType type);

  现在,我们来看一个既有定时alert又有模式alert的例子。下面的代码生成一个文本框对象和一个定时alert。当激活MIDlet 时,将显示该alert,五秒钟后文本框将自动显示出来。

TextBox tb = new TextBox("text box","Welcome to MIDP GUI Programming", 40, TextField.ANY);
Alert timedAlert = new Alert("Confirmation","Your message has been sent!", null, AlertType.CONFIRMATION);
TimedAlert.setTimeout(5000);
Display display = Display.getDisplay(this);
Display.setCurrent(timedAlert, tb);

  图 5展示了上面的代码是如何被显示的。一个提示"Your message has been sent!"的alert先被显示出来。五秒钟后,显示转到一个文本框,显示"Welcome to MIDP GUI Programming。"

Java手机软件图形界面API之screen相关API(3)
图 5.一个定时alert的例子

  如前面的例子所见,定时的alert不需要用户介入。另一方面,模式alert一直显示着,直到用户取消之,见下面例子。

TextBox tb = new TextBox("text box","Welcome to MIDP Programming",
40,Textfield.ANY);
Alert modalAert = new Alert("Error",
"Network error. Please try again later.",
null, AlertType.ERROR);
modalAlert.setTimeout(Alert.FOREVER);
Display display = Display.getDisplay(this);
display.setCurrent(modalAlert, tb);

  这时,显示网络错误的屏幕一直显示着,直到用户使用对应于Done命令的软键取消之,如图6所示。模式alert情况下的Done命令是由Sun公司的MIDP参考实现中自动提供的。在这个例子中,文本框屏幕仅在用户取消该alert后变成当前屏幕。

Java手机软件图形界面API之screen相关API(3)
图 6.一个模式alert的例子
 
6. List

  一个list是一个包含一系列可选项的screen。List和ChoiceGroup具有Choice 接口定义的一些共同的特性。用户可以通过一项项地移动与该list交互。注意,高级API交互并不激发任何回馈到应用程序的事件。这仅在作出一选择时发生。

  可用List类来创建List的实例:

public List(String title, int listType);
public List(String title, int listType, String[] stringElements,Image[] imageElements);

  第一个构造器用来创建一个空的list,不过可以指定标题和list类型。针对第二个参数,有3种类型列表可以选择: IMPLICIT, EXCLUSIVE和MULTIPLE。这些选项能被使用List类实现的Choice接口提供的常数来指定:

  ·EXCLUSIVE类型的list,一次仅有一个选项,与AWT中的一组单选按钮很相似。

  ·IMPLICIT类型的list,提供一种互斥的选项,此时焦点选项是隐式选择的,很象一个下拉菜单。

  ·MULTIPLE类型的list,一次可以提供任意数目的选项,以一系列复选框形式显示。

  例如,下面语句生成一个EXCLUSIVE类型的list,标题是"Choose one"。

List list = new List("Choose one", Choice.EXCLUSIVE);

  一旦你创造了一空列表,你就能插入,添加或在列表中进行选择替换。每个选择都有在列表中代表它的位置的一个整数索引。第一选择从0开始,直到的当前大小减一为止。为此,List类提供了下面一些方法:

public int append(String stringElement, Image imageElement);
public void insert(int index, String stringElement, Image imageElement);
public void set(int index, String stringElement, Image imageElement);

  注意选择由一个文本串和一可选的图像组成。例如,下面介绍如何把一些选择添加到前面的列表中去。注意append( )方法返回与该选项相关的已经传入的索引值,以备后面还需要它。

int saveIndex = list.append("save", null);
int deleteIndex = list.append("delete", null);

  你能使用下列方法删除列表的任何索引:

public void delete(int index);

  如果你想要检索对应任何索引值的文本元素或图像元素,下列方法可以实现:

public String getString(int index);
public Image getImage(int index);

  如果你想要设定,取消设定,或在列表检索当前被选择项的索引,或查询任何索引以判断是否它是当前被选中的,可以使用下列方法:

public int getSelectedIndex( )
public boolean isSelected(int index);
public setSelectedIndex(int index, boolean selected);

  最后,你可以使用一个布尔数组来设置整个列表的选定状态。这是典型的选项标志法,可以用下面的方法来存取。注意getSelectedFlags( )方法并不返回一个布尔数组,而是作修改(并返回以整数形式返回被选择的元素的数目);这是一种典型的优化技术,以防止在每次调用该方法时新建一个数组。该数组至少应该有同列表中元素数目一样的长度。如果更长了,超出相应长度的元素置为false。

public int getSelectedFlags(boolean[] selectedArray);
public void setSelectedFlags(boolean[] selectedArray);

  对MULTIPLE型列表,setSelectedFlags( )方法设置列表中每个元素的状态。对EXCLUSIVE 型或者IMPLICIT型列表,在布尔数组中,只有一个元素被设置为true;如果没有元素为true,那么第一元素将被选择。如果有两个或者多个元素为true,系统将选择第一个为true的元素并选中它。

  让我们看一些列表组件的例子。下面代码生成一个EXCLUSIVE型列表:

Display display = Display.getDisplay(this);
List menu = new List("Edit", Choice.EXCLUSIVE);
menu.append("Save");
menu.append("Move to");
menu.append("delete");
display.setCurrent(menu);

  在该列表中,仅可选择一选项,见图7。

Java手机软件图形界面API之screen相关API(4)
图 7.一个具有互斥选择的列表的例子

  如果你把列表类型设为IMPLICIT,结果将如图 8所示。注意这里的单选按钮已经去掉。

Java手机软件图形界面API之screen相关API(4)
图 8.一个具有隐式选择的列表的例子

  还是与EXCLUSIVE 类型一样,在该列表中,仅可选择一项;但是,焦点选项是隐式选择好的。第三种类型MULTIPLE的情况,如图 9示。

Java手机软件图形界面API之screen相关API(4)
图 9.一个具有多选择列表的例子

  如我们以前提及,在一个list中的选项由索引所参照,它们是0到size( ) - 1间的连续整数。0指向第一个选项,size( ) - 1指向最后一个选项。例如,可以如图8的方法来删除"Move To"选项:

list.delete(1);

  在此,我们使用第二个列表构造器来创建一列表,指定它的标题,列表的类型,一个字符串和一个图像串用作它的初始内容。下列代码创造一个有两个初始的选择但没有图象的列表:

List list2 =new List("Make a selection",Choice.EXCLUSIVE,{"Add", "Delete"},null);

  在列表的元素的个数由传递给构造器的数组stringElements(不能为null)的长度所决定。但是,数组imageElements可以是null。然而,如果该数组不是null,它的长度必须与stringElements一致。
 
阅读(2160) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~