作者:梁祺 (eclipsesbs@gmail.com)
来自:http://www.benisoft.net/day6/index.html
昨天我们在介绍布局时,已经接触过对话框了,今天我们来看一下在实际应用中,对话框是怎么工作的。 对话框一般是提供给用户和应用程序交互的窗口,它分为模态对话框(Modal)和非模态对话框(Non-modal)。
- 模态对话框:用户必须完成对话框内的操作,关闭对话框以后才能继续操作对话框以外的应用程序。
- 非模态对话框:用户不必关闭对话框,也能继续操作对话框以外的应用程序。
一般情况,我们用到的都是模态对话框,所以我们主要介绍模态对话框,如果没有特别说明,对话框就指模态对话框。
在Itinerary的例子里,当用户创建一个出行计划时,我们使用对话框让用户输入新建出行计划的名称和简单描述, 点击OK来创建新的出行计划。
NewItineraryAction打开对话框New Itinerary(eclipse.tutorial.itinerary.dialogs.NewItineraryDialog), 当用户输入出行计划的名称,点击OK,从对话框对象dialog获取新创建的Itinerary对象,代码如下。
...
public void run(IAction action) {
NewItineraryDialog dialog = new NewItineraryDialog(window.getShell());
int result = dialog.open();
if (result == Window.OK) {
Itinerary itinerary = dialog.getItinerary();
...
}
}
NewItineraryDialog有三个成员变量。
- itinerary是新建的出行计划Itinerary对象,它是对话框的输出。
- textName和textDescription是两个UI控件成员变量,分别用以接受用户输入出行计划名称和简单描述。
private Itinerary itinerary;
private Text textDescription;
private Text textName;
对话框一个重要的部分就是控件的布局,一般都需要花费大量精力来设计对话框的布局,并加以实现,我们这个例子比较简单。 使用一个两列的GridLayout,第一行布置出行计划名称的控件,第二行布置描述的控件。
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, false);
composite.setLayout(layout);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1,
1));
// Name
Label label = new Label(composite, SWT.NONE);
label.setText(\"Name: \");
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false,
false, 1, 1));
textName = new Text(composite, SWT.BORDER);
textName.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true,
false, 1, 1));
// Description
label = new Label(composite, SWT.NONE);
label.setText(\"Description: \");
label.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false,
false, 1, 1));
textDescription = new Text(composite, SWT.BORDER | SWT.MULTI);
textDescription.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
true, 1, 1));
return composite;
}
对话框另一个部分是对用户输入进行验证,在很多应用里,这部分是比较繁琐的,关键是心里需要有个清晰的定义, 有文档描述就更好(这个好像只有产品级的应用里才会专门有人做这个设计)。这个例子里要求出行计划名称是必须输入的, 实现也很简单,如果用户没有输入出行计划名称,就把OK按钮变灰,无法创建出行计划。这样做不太严谨,好在例子程序 大家也能看明白,所以问题不大。比较好的做法是用TitleAreaDialog,用警告的方式告诉用户需要输入出行计划名称。
既然对话框一开始就没有出行计划名称,我们就需要在OK按钮创建完成后立刻将它变灰,这个需要重载createButtonsForButtonBar(), 先调用父类的createButtonsForButtonBar()来创建Cancel按钮和OK按钮,然后将OK按钮变灰。另外还需要为textName 添加事件处理器来获取文本框的修改事件,如果文本框内容为空,将OK按钮变灰,否则,恢复OK按钮。
super.createButtonsForButtonBar(parent);
getButton(OK).setEnabled(false);
}
void addListeners() {
textName.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
getButton(OK).setEnabled(! textName.getText().isEmpty());
}});
}
对话框最后一部分是从控件中获取数据,通过某种方式返回给调用者。在这个例子里, 当用户输入出行计划名称和描述,点击OK按钮后,Eclipse会调用okPressed()方法。在这个方法里,从textName和 textDescription获取名称和简单描述后,创建Itinerary对象,保存在itinerary成员变量上, 最后通过getItinerary()方法传递出去。这是一个常规的做法。
protected void okPressed() {
String name = textName.getText();
String description = textDescription.getText();
itinerary = new Itinerary(name);
itinerary.setDescription(description);
super.okPressed();
}
对话框我们就介绍到这里,其实很简单,就三个部分,控件布局,输入验证,以及返回数据给调用者。不过实现和测试 的工作量都比较大,估计工作量的时候要有充分的余量。
相关推荐
第一章 关于本手册........................................................................................................................................ 1 简介 ..........................................
图6是个简单的例子,通过OnEraseBkgnd为对话框加载了一副位图背景: 图6 利用WM_ ERASEBKGND消息美化界面 实现代码也很简单: BOOL CUi4Dlg::OnInitDialog() { //… //加载位图 //CBitmap m_Back; m_Back....
准备工作做完了,下一步就是要将pclint集成到VC6中去,先配置lint使之能对单个C或C++文件进行检查。 1.打开VC6,tools--->customize-->tools 新建一个名为pclint的项,在下面填入 command: C:\pclint\lint-nt.exe ...
则软件默认为“帮助”):按[Project]项目选项中左边第三个按钮“新建/编辑窗口显示风格”,在弹出的窗口类型中随便输入一个名字如“12”,按“OK”后就会进入“窗口属性”定义对话框。在[General]选项卡中的...
第六步:在开始菜单文件夹中创建程序的文件夹名称。点击“下一步”,继续下一步安装; 第七步:选择附加任务:创建桌面快捷方式和快捷启动栏快捷方式,以及Section关联MapGis文件等。勾选所需选项,点击“下一步”,...
管脚绑定也可以利用tcl 命令来完成,我们做实验的时候要反复用到数码管的下载,数 码管的绑定每次都是一样的,而且我们都是用自己设计的扫描电路和7段译码器,因此我们 可以利用tcl命令来简化我们自己的绑定。一种...
问题 2-2: 什么是 Active Document,什么时候需要用到它?它与 Visual Basic 中的 Active Document 有什么不同? 答案: Active Document 是在 Intranet 上配置 Visual FoxPro 应用程序的一种方法。您可以使用 ...
(7) 在单元格中显示公式如果工作表中的数据多数是由公式生成的,想要快速知道每个单元格中的公式形式,以便编辑修改,可以这样做:用鼠标左键单击“工具”菜单,选取“选项”命令,出现“选项”对话框,单击“视图...
如您选择第一象限则在右上角倒斜角,第二象限在左上角倒斜角,第三第四象限在左下角和右下角倒斜角。 “基准台与铜公体合并”是基准台与铜公体做布尔并运算。“手动合并”是要您选择铜公体做合并。 “自动合并”是...
6、问:调整输入法顺序为何有时不起作用? 答:此功能主要适用于使用输入法指示器的情况,在高级文字服务模式下,系统往往会记住你上次使用的输入法,并动态调整。另外在 Win95/NT 系统下,调整顺序需要重启系统方可...
脱壳 步骤 脱壳步骤 壳的概念: 所谓“壳”就是专门压缩的工具。 ... 壳的作用: 1.保护程序不被非法修改和反...做一个内存注册机 需要下面几个资料 中断地址:406F0C 中断次数:1 第一字节:51 指令长度:1
• 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都含有标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如表示首行...
默认情况下,存储在全局目录中的对象属性是那些经常用到的内容,而非全部属性。 - g' B e* Q1 b' N! @ 4 k9 H# a7 L4 C" C全局目录服务器是一个域控制器,活动目录建立的第一个域控制器自动成为全局目录服务器。全局...
6、问:输入法风格中的“输入法指示器”和“高级文字服务”有什么区别? 答:在 Office XP 未出现之前,Win 9X 和 Windows 2000 中一直使用输入法指示器(internat.exe),即在任务栏系统托盘区中显示输入法列表的...
则修改第一行:"name":"admin","password":"21232f297a57a5a743894a0e4a801fc3" ![](https://cloud.githubusercontent.com/assets/3761968/2583304/764f562a-b9cf-11e3-8e59-afdbdffc20eb.png) ###ver2.61 `...
本文档介绍Sphinx4在Windows下的中文训练过程及注意事项,与本文档配套的是我自己的训练实例bergtrain和用到的软件。 本文档编写日期 2013-04-23 1、为什么要训练? sphinx4目前的版本中仅提供了英文等语音识别库。...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
每当扩展结点时,意是在所有待扩展结点中选择具有最小F值的结点做为扩展对象,以便使搜索尽量沿最有希望的方向进行.A*算法只要求产生问题的全部状态空间的部分结点及关系,就可以求解问题了,搜索效率较高。 1.3 A*算法...
第六招:启用DMA传输模式 启用DMA模式之后,计算机周边设备(主要指硬盘)即可直接与内存交换数据,这样能加快硬盘读写速度,提高数据传输速率:打开“设备管理器”,其中“IDE ATA/ATAPI控制器”下有“主要IDE通道...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...