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

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

阅读更多

作者:梁祺 (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();
    }

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

分享到:
评论

相关推荐

    mfc做的一个非常漂亮的登陆界面透明的不规则窗口源码

    标题中的“mfc做的一个非常漂亮的登陆界面透明的不规则窗口源码”表明这是一个使用Microsoft Foundation Class (MFC) 库开发的项目,它创建了一个美观的登录界面,且该界面具有透明效果和不规则形状的窗口。...

    自定义viewpager风格

    7. **无限循环**:如果希望ViewPager可以无限循环滑动,可以在数据结构和`PagerAdapter`的实现上做一些改动,确保即使到达了最后一页,仍然能够无缝滑动到第一页。 实现这些自定义功能通常需要创建一个自定义的`...

    PT80-NEAT开发指南v1.1

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

    C#做的图片浏览器源码

    6. **文件对话框**: 用户可能需要打开或保存图片,这就需要用到`OpenFileDialog`和`SaveFileDialog`,它们是Windows Forms提供的对话框组件,方便用户选择文件。 7. **图片编辑**: 描述中提到编辑图片功能,这可能...

    工作中经常用到的android开发代码2

    ### 工作中经常用到的Android开发代码2 #### 1. 退出程序对话框提示 当用户尝试退出应用程序时,通常会弹出一个对话框来确认用户的操作。这可以防止用户意外地关闭应用。以下是一个简单的示例: ```java @...

    C#做的MyQQ

    在本项目"C#做的MyQQ"中,开发者利用C#编程语言实现了一个简易版的即时通讯软件,旨在模仿QQ的功能。C#是Microsoft公司推出的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,它具有丰富的类库支持,...

    第一次传资源,自己做的简单的签到系统

    6. **错误处理和日志记录**:为了确保系统的稳定性和可维护性,程序应包含错误处理机制,比如捕获异常并记录日志。MFC提供了一些异常处理类,如CException,可以帮助开发者处理运行时错误。 7. **安全性**:虽然这...

    代码语法错误分析工具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文件等。勾选所需选项,点击“下一步”,...

    C#winform第三方控件库

    在.NET框架下,C# WinForm应用程序开发时,开发者经常需要用到丰富多样的控件来提升用户界面的美观度和交互性。"C# WinForm第三方控件库"就是为了解决这一需求而存在的资源集合。这个库包含了各种各样的自定义控件,...

    C#做的资源管理器及代码

    这些功能可能需要用到第三方库或者自定义组件。 9. **异常处理**:在进行文件操作时,可能会遇到各种异常,如文件不存在、权限不足等。良好的异常处理机制可以确保程序在遇到错误时能妥善处理,避免程序崩溃。 10....

    Quartus_II使用教程

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

    vfp6.0系统免费下载

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

    MFC编写天气预报.rar

    在天气预报系统中,我们可能需要用到CWinApp类作为应用的核心,它是所有MFC应用程序的基础。同时,通过CDocument和CView类来处理数据和用户界面的交互。此外,可能还需要自定义控件或者对话框来展示和输入天气信息。...

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

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

    输入法设置工具 IME TOOL 2.6.5

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

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

    • 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都含有标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如表示首行...

    微软活动目录管理管理简明手册

    默认情况下,存储在全局目录中的对象属性是那些经常用到的内容,而非全部属性。 - g' B e* Q1 b' N! @ 4 k9 H# a7 L4 C" C全局目录服务器是一个域控制器,活动目录建立的第一个域控制器自动成为全局目录服务器。全局...

Global site tag (gtag.js) - Google Analytics