`
eclipsesbs
  • 浏览: 19824 次
社区版块
存档分类
最新评论

第六天:天天用到的对话框是怎么做的

阅读更多

作者:梁祺 (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 class NewItineraryAction implements IWorkbenchWindowActionDelegate {
        ...
    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控件成员变量,分别用以接受用户输入出行计划名称和简单描述。
public class NewItineraryDialog extends Dialog {

    private Itinerary itinerary;
    private Text textDescription;
    private Text textName;

对话框一个重要的部分就是控件的布局,一般都需要花费大量精力来设计对话框的布局,并加以实现,我们这个例子比较简单。 使用一个两列的GridLayout,第一行布置出行计划名称的控件,第二行布置描述的控件。

    protected Control createDialogArea(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout(2, false);
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, truetrue, 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按钮。

    protected void createButtonsForButtonBar(Composite parent) {
        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()方法传递出去。这是一个常规的做法。

    @Override
    protected void okPressed() {
        String name = textName.getText();
        String description = textDescription.getText();
        itinerary = new Itinerary(name);
        itinerary.setDescription(description);

        super.okPressed();
    }

对话框我们就介绍到这里,其实很简单,就三个部分,控件布局,输入验证,以及返回数据给调用者。不过实现和测试 的工作量都比较大,估计工作量的时候要有充分的余量。

分享到:
评论

相关推荐

    PT80-NEAT开发指南v1.1

    第一章 关于本手册........................................................................................................................................ 1 简介 ..........................................

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    图6是个简单的例子,通过OnEraseBkgnd为对话框加载了一副位图背景: 图6 利用WM_ ERASEBKGND消息美化界面 实现代码也很简单: BOOL CUi4Dlg::OnInitDialog() { //… //加载位图 //CBitmap m_Back; m_Back....

    代码语法错误分析工具pclint8.0

    准备工作做完了,下一步就是要将pclint集成到VC6中去,先配置lint使之能对单个C或C++文件进行检查。 1.打开VC6,tools--->customize-->tools 新建一个名为pclint的项,在下面填入 command: C:\pclint\lint-nt.exe ...

    MicrosoftHTMLHelpWorkshopV1.3汉化版.rar

    则软件默认为“帮助”):按[Project]项目选项中左边第三个按钮“新建/编辑窗口显示风格”,在弹出的窗口类型中随便输入一个名字如“12”,按“OK”后就会进入“窗口属性”定义对话框。在[General]选项卡中的...

    MAPGIS地质制图工具

    第六步:在开始菜单文件夹中创建程序的文件夹名称。点击“下一步”,继续下一步安装; 第七步:选择附加任务:创建桌面快捷方式和快捷启动栏快捷方式,以及Section关联MapGis文件等。勾选所需选项,点击“下一步”,...

    Quartus_II使用教程

    管脚绑定也可以利用tcl 命令来完成,我们做实验的时候要反复用到数码管的下载,数 码管的绑定每次都是一样的,而且我们都是用自己设计的扫描电路和7段译码器,因此我们 可以利用tcl命令来简化我们自己的绑定。一种...

    vfp6.0系统免费下载

    问题 2-2: 什么是 Active Document,什么时候需要用到它?它与 Visual Basic 中的 Active Document 有什么不同? 答案: Active Document 是在 Intranet 上配置 Visual FoxPro 应用程序的一种方法。您可以使用 ...

    excel的使用

    (7) 在单元格中显示公式如果工作表中的数据多数是由公式生成的,想要快速知道每个单元格中的公式形式,以便编辑修改,可以这样做:用鼠标左键单击“工具”菜单,选取“选项”命令,出现“选项”对话框,单击“视图...

    进玉电极模块_v5.0_nx4.0_简体版

    如您选择第一象限则在右上角倒斜角,第二象限在左上角倒斜角,第三第四象限在左下角和右下角倒斜角。 “基准台与铜公体合并”是基准台与铜公体做布尔并运算。“手动合并”是要您选择铜公体做合并。 “自动合并”是...

    输入法设置工具 IME TOOL 2.6.5

    6、问:调整输入法顺序为何有时不起作用? 答:此功能主要适用于使用输入法指示器的情况,在高级文字服务模式下,系统往往会记住你上次使用的输入法,并动态调整。另外在 Win95/NT 系统下,调整顺序需要重启系统方可...

    exe文件脱壳步骤txt下载

    脱壳 步骤 脱壳步骤 壳的概念: 所谓“壳”就是专门压缩的工具。 ... 壳的作用: 1.保护程序不被非法修改和反...做一个内存注册机 需要下面几个资料 中断地址:406F0C 中断次数:1 第一字节:51 指令长度:1

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    • 第六章: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),即在任务栏系统托盘区中显示输入法列表的...

    KODExplorer 芒果云-资源管理器

    则修改第一行:"name":"admin","password":"21232f297a57a5a743894a0e4a801fc3" ![](https://cloud.githubusercontent.com/assets/3761968/2583304/764f562a-b9cf-11e3-8e59-afdbdffc20eb.png) ###ver2.61 `...

    sphinx中文语音训练手册

    本文档介绍Sphinx4在Windows下的中文训练过程及注意事项,与本文档配套的是我自己的训练实例bergtrain和用到的软件。 本文档编写日期 2013-04-23 1、为什么要训练? sphinx4目前的版本中仅提供了英文等语音识别库。...

    java源码包2

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    基于A*算法的人工智能程序

    每当扩展结点时,意是在所有待扩展结点中选择具有最小F值的结点做为扩展对象,以便使搜索尽量沿最有希望的方向进行.A*算法只要求产生问题的全部状态空间的部分结点及关系,就可以求解问题了,搜索效率较高。 1.3 A*算法...

    如何查杀运行状态下的EXE、DLL病毒

    第六招:启用DMA传输模式 启用DMA模式之后,计算机周边设备(主要指硬盘)即可直接与内存交换数据,这样能加快硬盘读写速度,提高数据传输速率:打开“设备管理器”,其中“IDE ATA/ATAPI控制器”下有“主要IDE通道...

    java源码包---java 源码 大量 实例

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

Global site tag (gtag.js) - Google Analytics