Java手机软件图形界面API之screen相关API
看过一个关于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。
图1.包lcdui中的主要类间的类关系图
然而,Screen仅是一个有其自身一些功能的抽象类。每个Screen可以有两个额外的特性:标题和ticker。标题是显示在screen 内容之上的一个字符串。Ticker是一个图形组件,它显示在标题上方,可用于横向卷动显示给用户的信息。二者皆是可选的,尽管标题串有一个缺省的内容。如果省略了ticker,则一点不显示并把相应的空间让给screen。后面我们要讨论Ticker组件。但是,图 2显示了Screen 对象的标题和ticker 属性之间的相对位置关系。
图 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组件的上方。
图 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所示的效果。注意,如果要显示的文本长于一屏的,系统将允许用户卷动查看并进行编辑-具体依赖于系统的实现。
图 4.display和screen之间的关系<
补充:软件开发 , Java ,