eSWT 移动扩展简介,第 3 部分: 在移动应用程序中使用高级对话框以及与设备相关的特性
2010-03-17 00:00:00 来源:WEB开发网简介
本系列的 eSWT 移动扩展简介,第 1 部分:使用简单小部件快速构建移动应用程序 “使用简单小部件快速构建移动应用程序” 对移动扩展包作了概述。它还描述了一些基本控件(CaptionedControl、ConstrainedText、DateEditor、ListBox 和 ListView)。
eSWT 移动扩展简介,第 2 部分:在移动应用程序中使用高级控件 “在移动应用程序中使用高级控件” 则涵盖了一些高级控件(MobileShell、SortedList、HyperLink、TextExtension 和 TaskTip)。
在本文中,学习如何使用:
MultiPageDialog 创建一个选项卡对话框。
QueryDialog 给出一个提示对话框供用户获得数据输入。
TimedMessageBox 简单地告知用户有限的信息。
MobileDevice 获得有关设备特征和功能的更多信息。
Screen 表示可供应用程序使用的显示屏。
Input 表示基于键的输入特性。
MultiPageDialog
类的实例表示一个选项卡对话框。此对话框包含多个页面。每个页面均包含一个复合组件(composite)。在任何给定的时刻,只有一个页面是可见的。页面是否可见可以由终端用户选定,也可以通过应用程序编程选定。每个页面都要有一个标签。此标签可以被平台显示为文本、图标或是同时显示为两者。页面标签的大小和位置依赖于实现。对话框的边界也依赖于实现。页面创建后,应用程序可以通过 page.getBounds 查询页面的实际大小。
MultiPageDialog
页面的数量没有固定的限制。但是如果没有足够的资源来创建一个新页面,就会抛出一个运行时异常。
与页面相关的命令只有在页面可见时才有效。这些命令也可以与整个 MultiPageDialog 关联,只需将对话框的 shell 设置为这些命令的关联控件,如下所示:
Command c = new Command(page.getShell(), Command.GENERAL, 10)
MultiPageDialog 是一个模态对话框,支持如下样式。它依赖于实现;实际的外观和行为可能会因设备而不同。
SYSTEM_MODAL
APPLICATION_MODAL
PRIMARY_MODAL
清单 1 显示了创建 MultiPageDialog 的示例代码。
清单 1. 创建 MultiPageDialog
Composite pages[] = new Composite[3];
MultiPageDialog mpd = new MultiPageDialog(shell);
pages[0] = mpd.createPage("Personal",null);
pages[1] = mpd.createPage("Business",null);
pages[2] = mpd.createPage("Travel",null);
pages[0].setLayout(new RowLayout(SWT.VERTICAL));
// Name
CaptionedControl name = new CaptionedControl(pages[0], SWT.LEFT_TO_RIGHT);
name.setText("Name:");
Text userName = new Text(name, SWT.SINGLE);
userName.setText("John");
userName.setEditable(true);
// Surname
CaptionedControl surname = new CaptionedControl(pages[0], SWT.LEFT_TO_RIGHT);
surname.setText("Surname:");
Text userSurname = new Text(surname, SWT.SINGLE);
userSurname.setText("Marshall");
// Date of birth
CaptionedControl birthDate = new CaptionedControl(pages[0], SWT.LEFT_TO_RIGHT);
birthDate.setSize(200,30);
birthDate.setText("Date of birth:");
DateEditor birthDateEditor = new DateEditor(birthDate, SWT.NORMAL, DateEditor.DATE |
DateEditor.FULL);
// Phone number
CaptionedControl phoneNumber = new CaptionedControl(pages[0], SWT.LEFT_TO_RIGHT);
phoneNumber.setText("Phone number:");
ConstrainedText userPhoneNumber = new ConstrainedText(phoneNumber, SWT.NORMAL,
ConstrainedText.PHONENUMBER);
userPhoneNumber.setText("6902690369");
pages[0].layout();
mpd.open();
上述的代码片段创建了一个具有三个页面的 MultiPageDialog,如下所示。
图 1. 样例 MultiPageDialog
具有 SWT.VIRTUAL 样式的 MobilMultiPageDialog
如果要创建的 MultiPageDialog 具有多个页面(选项卡)并且每个页面上有多个小部件,那么 MultiPageDialog 的初始化以及显示都将会花费很长时间。为了在启动具有很多页面且每个页面内又具有很多控件的 MultiPageDialog 时改进性能,可以创建它的 SWT.VIRTUAL 样式。
清单 2 显示了创建一个具有 SWT.VIRTUAL 样式的 MultiPageDialog 的示例代码。
清单 2. 创建一个具有 SWT.VIRTUAL 样式的 MultiPageDialog
MultiPageDialog dialog = new MultiPageDialog(shell, SWT.PRIMARY_MODAL|SWT.VIRTUAL);
dialog.setText("ESWT_CORE_EX_005_VirtualMPD");
int j=6;
for(int i=1;i<j;i++){
dialog.createPage("Page"+i, null);
}
dialog.addListener(SWT.SetData, new Listener() {
public void handleEvent(Event event) {
Composite page = (Composite)event.item;
switch(event.index) {
case 0:
{
page.setLayout(new FillLayout());
List list = new List(page, SWT.SINGLE);
list.add("A");
list.add("B");
page.layout();
}
break;
case 1:
{
page.setLayout(new FillLayout());
SortedList sortedList = new SortedList(page, SWT.V_SCROLL, SortedList.FILTER);
sortedList.add("banana");
sortedList.add("123");
sortedList.add("12");
sortedList.add("happyhour");
sortedList.add("toobad");
sortedList.add("youknowwhat");
sortedList.add("yes");
sortedList.add("886222333");
page.layout();
}
break;
case 2:
{
page.setLayout(new FillLayout());
Table table = new Table(page, SWT.FULL_SELECTION | SWT.BORDER);
table.setHeaderVisible(true);
TableColumn column = new TableColumn(table,SWT.LEFT);
column.setText("Not Virtual Table");
column.setWidth(480);
for(int i = 0; i<10 ; i ++) {
TableItem tableitem = new TableItem(table, SWT.NONE, i);
tableitem.setText(String.valueOf(i)+"\n"+"I am Sam");
}
table.pack();
page.layout();
}
break;
default:
{
Tree tree = new Tree(page, SWT.FULL_SELECTION | SWT.BORDER);
tree.setVisible(true);
tree.pack();
for (int k=0;k<10;k++){
TreeItem treeitem = new TreeItem(tree, SWT.NONE,k);
treeitem.setText(String.valueOf(k));
for (int m=0;m<10;m++){
TreeItem subtreeitem = new TreeItem(treeitem, SWT.NONE,m);
subtreeitem.setText(String.valueOf(m));
}
}
tree.setBounds(page.getClientArea());
}
}
}
});
dialog.open();
上述代码创建了一个具有五个页面的 MultiPageDialog,如图 2 所示。它还添加了一个侦听程序来侦听 SWT.Set_Data 事件。若用户选择了一个页面,侦听程序就会捕获 SWT.Set_Data 以便基于选定的页面索引初始化和显示相应的控件。对比在所有 控件和页面都初始化后才显示 MultiPageDialog,这将节省很多时间。
图 2. 具有 SWT.VIRTUAL 样式的 MultiPageDialog
查看原图(大图)
QueryDialog
可创建一个模态窗口来提示终端用户输入数据。它包含一个提示文本和一个输入字段。QueryDialog 支持五种类型的输入字段:STANDARD、NUMERIC、 PASSWORD、TIME 和 DATE。对话框的位置和大小均依赖于实现。
QueryDialog
可以使用如下所示的一种样式来创建一个 QueryDialog。若在不指定样式(比如 QueryDialog(Shell parent))的情况下创建一个 QueryDialog,那么 APPLICATION_MODAL 就是默认的样式。
APPLICATION_MODAL模态限于这个应用程序。用户输入在同一个 应用程序内的其他窗口受阻,但在其他应用程序不受阻。PRIMARY_MODAL模态限于此对话框的父窗口。用户输入只在对话框的父窗口受阻。
清单 3 显示了 QueryDialog 的一个代码示例。
清单 3. QueryDialog 示例
QueryDialog dialog = new QueryDialog(shell, SWT.NONE, QueryDialog.STANDARD);
dialog.setPromptText("Enter game name:", "enter here");
String gameName = dialog.open();
QueryDialog dialog2 = new QueryDialog(shell, SWT.NONE, QueryDialog.PASSWORD);
dialog2.setPromptText("Enter password:", "19800828");
dialog2.setMaximum(12);
dialog2.setMinimum(6);
String passwd= dialog2.open();
QueryDialog dialog3 = new QueryDialog(shell, SWT.NONE, QueryDialog.TIME);
dialog3.setPromptText("Enter TIME:", "14:14:14");
String time= dialog3.open();
QueryDialog dialog4 = new QueryDialog(shell, SWT.NONE, QueryDialog.NUMERIC);
dialog4.setPromptText("Enter number:", "19800828");
dialog4.setMaximum(15);
dialog4.setMinimum(10);
String num= dialog4.open();
QueryDialog dialog5 = new QueryDialog(shell, SWT.NONE, QueryDialog.DATE);
dialog5.setPromptText("Enter DATE:", "2006-05-01");
String date= dialog5.open();
上述代码创建了五种 QueryDialog。图 3 显示了具有一些示例输入文本的结果。
第一个 QueryDialog 用默认文本 “Enter here” 进行提示。您可以对之进行修改并键入任何文本。若单击 OK,它会将 gameName 的值设为被输入的文本。如果单击 Cancel,则不会进行任何设置。
第二个 QueryDialog 用 * 样式的默认密码 19800828 进行提示。您可以键入任何密码文本;文本的长度被限制为 6-12 字符。如果单击 OK,它会将 passwd 的值设为所输入的文本。如果单击 Cancel,则不会进行任何设置。
第三个 QueryDialog 用 hh:mm:ss 样式的默认时间 14:14:14 进行提示。您可以输入任何数字。如果单击 OK,它会将 time 的值设为所输入的文本。如果单击 Cancel,则不会进行任何设置。
第四个 QueryDialog 用默认数字 19800828 进行提示。您可以键入任何数字;数字文本的长度被限制为 10-15。如果单击 OK,它会将 num 的值设为所输入的文本。如果单击 Cancel,则不会进行任何设置。
第五个 QueryDialog 用默认的日期 2006-05-01 进行提示。显示的格式依赖于本地语言环境。您可以输入任何日期。如果单击 OK,它会将 date 的值设为所输入的文本。如果单击 Cancel,则不会进行任何设置。
图 3. 示例 QueryDialog
TimedMessageBox
是一个模态窗口,可用来以一种标准的样式简单地通知用户有限的信息。一个 TimedMessageBox 可在一段时间后自动关闭。无需为 TimedMessageBox 定义按钮样式。与 TaskTip 不同,TimedMessageBox 是一个模态对话框,因此执行将一直受阻,直到此对话框在一小段时间后关闭。实际的超时时长依赖于实现。应用程序不能更改时长。
TimedMessageBox
可以使用如下所示的这些样式来标识所创建的 TimedMessageBox 的类型。
ICON_WORKING告知某动作成功。ICON_INFORMATION告知可能不需要用户动作。ICON_WARNING告知可能需要用户介入。ICON_ERROR告知有一个严重情况发生。
清单 4 所示的代码创建了不同类型的 TimedMessageBox。
清单 4. TimedMessageBox 示例
TimedMessageBox tmb1 = new TimedMessageBox(shell,SWT.ICON_WORKING);
tmb1.setMessage("This is a ICON_WORKING message");
TimedMessageBox tmb2 = new TimedMessageBox(shell,SWT.ICON_INFORMATION);
tmb2.setMessage("This is a ICON_INFORMATION message");
TimedMessageBox tmb3 = new TimedMessageBox(shell,SWT.ICON_WARNING);
tmb3.setMessage("This is a ICON_WARNING message");
TimedMessageBox tmb4 = new TimedMessageBox(shell,SWT.ICON_ERROR);
tmb4.setMessage("This is a ICON_ERROR message");
tmb1.open();
tmb2.open();
tmb3.open();
tmb4.open();
上述代码创建了三种类型的四个 TimedMessageBox,如图 4 所示。它会顺序显示每个 TimedMessageBox 并且会自动关闭它。
图 4. 示例 TimedMessageBox
MobileDevice
类的实例代表的是正在使用的设备。它提供了一些方法供应用程序更多地了解特定于设备的特征和功能。
MobileDevice
应用程序可以查询哪些输入特性和显示屏幕是此设备的永久部分。这被视为是本地 特性。有些设备还允许输入机制或屏幕在运行时才被加到此设备。这被视为是远端 特性。因为本地特性不是时有时无的,因而只查询它们一次就够了。因远端设备可在任何时候添加或删除,所以一个应用程序需要添加一个 MobileDeviceListener 以便在这些事件发生时得到通知。
MobileDeviceEvent
具有其自己的事件,即 MobileDeviceEvent,它在设备配置发生变化时发出。应用程序可以添加 MobileDeviceListener 以便在事件触发时获得通知。MobileDeviceListener 内定义了三种方法,如下所示。
MobileDevice
MobileDeviceListener 内定义的方法
方法名称 | 描述 |
deviceChanged(MobileDeviceEvent 事件) | 设备配置发生改变(比如打开或关闭)时调用 |
inputChanged(MobileDeviceEvent 事件) | 输入配置发生改变时调用。 |
screenChanged(MobileDeviceEvent 事件) | 屏幕配置发生改变时调用。 |
使用如下方法,应用程序可以添加和删除 MobileDeviceListener。
添加和删除 MobileDeviceListener
方法名称 | 描述 |
addMobileDeviceListener(MobileDeviceListener 侦听程序) | 将这个侦听程序添加到侦听程序集,当设备配置发生改变时通过调用 MobileDeviceListener 接口内定义的一个方法通知侦听程序。 |
removeMobileDeviceListener(MobileDeviceListener 侦听程序) | 从侦听程序集中删除侦听程序,当设备配置发生改变时将通知侦听程序。 |
获得设备
一个应用程序不能使用 MobileDevice() 创建 MobileDevice 的一个实例。要获得 MobileDevice 的一个静态实例,应用程序应该使用 getMobiledevice()。移动设备一般不能由应用程序更改;它们充当的是一个静态对象,应用程序可查询设备配置并在配置变化时获得通知。
用来从 MobileDevice 对象获得 MobileDevice、Input 和 Screen 对象的方法
方法名称 | 描述 |
getMobileDevice() | 返回 MobileDevice 类的一个单独实例。 |
getInputs() | 返回描述可用于此设备的输入特性的 Input 对象数组。 |
getScreens() | 返回描述可用于此设备的显示特性的 Screen 对象数组。 |
清单 5 显示了如何获得 MobileDevice 的一个实例并获得设备配置,包括 Input 和 Screen。
清单 5. MobileDevice 示例
final MobileDevice md = MobileDevice.getMobileDevice();
Screen[] screens = md.getScreens();
Input[] inputs = md.getInputs();
屏幕
Screen 控件代表可供应用程序使用的屏幕。Screen 定义了表示 Screen 实例目的的一些使用类型,如下所示。
PRIMARY一次只有一个主屏幕处于活动状态。SECONDARY同时可以有多个副屏幕处于活动状态。STATUS副屏幕的子类型,显示极少的内容以用于通知。
Screen 定义了方向样式。
LANDSCAPE表明文本通常跨最长的宽度。PORTRAIT表明文本通常跨最短的宽度。
事件
Screen 定义了其自己的事件,即屏幕配置更改时的 ScreenEvent。一个应用程序可以添加 ScreenEvent 以便在事件触发时获得通知。ScreenListener 内定义了三种方法。
ScreenListener 内定义的方法
方法名称 | 描述 |
screenActivated(ScreenEvent 事件) | 在屏幕激活时发出。 |
screenDeactivated(ScreenEvent 事件) | 在屏幕不再激活时发出。 |
screenOrientationChanged(ScreenEvent 事件) | 在屏幕的方向改变时发出。 |
使用如下方法,应用程序可以添加和删除 ScreenListener。
添加和删除 ScreenListener
方法名称 | 描述 |
addEventListener(ScreenListener 侦听程序) | 将侦听程序添加到侦听程序集,通过向其发送 ScreenListener 接口内定义的一个消息可在发生屏幕事件时通知侦听程序。 |
removeEventListener(ScreenListener 侦听程序) | 从侦听程序集中删除侦听程序,在屏幕事件发生时将通知侦听程序。 |
获得屏幕配置
Screen 提供了几个方法来获得屏幕配置,如下所示。
获得屏幕配置的方法
方法名称 | 描述 |
getBounds() | 返回屏幕的界限。 |
getColorDepth() | 返回屏幕的色深,单位是比特/像素。 |
getLocation() | 返回屏幕设备的位置。 |
getOrientation() | 返回屏幕的方向。 |
getUsage() | 返回屏幕的使用类型。 |
除了屏幕配置的检索外,Screen 还提供了一种方法来改变方向。
用来改变方向的方法
方法名称 | 描述 |
setOrientation(int orientation) | 若此设备支持,可设置屏幕的方向。 |
清单 6 显示了如何获得 Screen 的一个数组并输出每个屏幕的边界。
清单 6. 屏幕示例
final MobileDevice md = MobileDevice.getMobileDevice();
Screen[] screens = md.getScreens();
for(int i=0; i<screens.length; i++) {
Rectangle bounds = screens[i].getBounds();
System.out.println("screen "+i+": width="+bounds.width+", height="+bounds.height);
}
输入
Input 代表基于键的输入特性。Input 有四种类型。
FULL_KEYBOARD输入特性具有完整键盘所具有的典型硬件键。KEYPAD输入特性只具有标记为 0-9、* 和 # 的硬件键。LIMITED_KEYBOARD输入特性具有比键区多、比完整键盘少的硬件键。SOFTKEYS输入特性具有一个或多个含义可配置的硬件键。
获得输入配置
Input 提供了两种方法来检索输入配置。
检索输入配置的方法
方法名称 | 描述 |
getLocation() | 返回输入设备的位置。 |
getType() | 返回输入设备的类型。 |
结束语
在 “eSWT 移动扩展简介” 系列的最后一篇文章中,您学习了另外六个可用来丰富移动应用程序的强大 eSWT 移动控件。您可以开始为各种不同的移动电话开发能够访问与设备相关的特征的 Java 应用程序。
本文示例源代码或素材下载
更多精彩
赞助商链接