向导式对话框是一种非常友好的界面,它能够引导用户一步步的输入信息.Eclipse的"新建项目",就是这样的向导式对话框.

在Eclipse中向导式对话框的开发是很简单的,它由WizardDialog类来创建向导式对话框.

WizardDialog的继承关系图:

当然仅仅有WizardDialog还是不够的,还需要有Wizard类,WizardPage类来辅助使用.

向导式对话框中每一步显示的页面由WizardPage类负责创建,Wizard类则负责管理WizardPage页面.

WizardDialog最简单,它和InputDialog等的使用相同,所以在向导式对话框的创建中,Wizard和Wizardpage的编程才是重点.

WizardDialog,Wizard,WizardPage三者的关系图如下:

通过一个例子了解:如何创建向导式的对话框,如何给向导式的对话框设置初始值.

如何对值做验证,如何取得向导式对话框中的值,实际开发中也无非就是这些内容,只不过界面组件更多了一些罢了.

向导式对话框使用的时的注意事项

向导式对话框在单击"下一步","上一步"按钮时都会执行MyWizard类的canFinish方法,因此在写

这种方法的时候要注意保证程序的执行效率.

向导式对话框实例:

实现一个简单的向导式对话框,此对话框用于手机用户的资料.它有两个页面,第一个页面收集姓名和Email,第二页面收集学校.最后单击"完成"按钮结束向导后,输出各页面收集到的信息.

如何创建向导式对话框:如何给向导式对话框设初始值:如何对值做验证;如何取得向导式对话框中的值.实际开发中也无非是这些内容.只不过界面组件更多一些罢了.

实例的代码如下:

(1)主程序中对WizardDialog的使用.将Wizard作为参数传给WizardDialog.代码如下:

WizardDialog1.java

 1 import org.eclipse.jface.wizard.WizardDialog;
 2 import org.eclipse.swt.widgets.Display;
 3 import org.eclipse.swt.widgets.Shell;
 4
 5 public class WizardDialog1 {
 6     public static void main(String[] args) {
 7         Display display = Display.getDefault();
 8         Shell shell = new Shell(display);
 9
10         WizardDialog dialog = new WizardDialog(shell, new MyWizard());
11         dialog.setPageSize(-1, 60); // dialog大小,-1是指让宽度自动调整
12         dialog.open();
13
14         display.dispose();
15     }
16 }

(2)WizardDialog用到的MyWizard类的代码如下:

MyWizard类主要是改写父类Wizard的3个方法:addPages.canFinish和performFinish.

在addPages方法中加入页面和为页面设置初始值:在canFinish方法中判断"完成"按钮是否可用,在performFinish方法中编写退出向导时候处理程序.

MyWizard.java

 1 import org.eclipse.jface.wizard.Wizard;
 2
 3 public class MyWizard extends Wizard {
 4     // 把两页面对象定义成实例变量,使其他方法能访问得到
 5     private NamePage namePage;// 页面一,继承自WizardPage类
 6     private SchoolPage schoolPage;// 页面二,继承自WizardPage类
 7
 8     // 在此方法将两页面加入并设置初值
 9     public void addPages() {
10         // 创建页面对象,并设置页面的名称
11         namePage = new NamePage("namePage");
12         schoolPage = new SchoolPage("schoolPage");
13         // 设置页面的初始值
14         namePage.setName("陈刚");
15         namePage.setEmail("glchengang@yeah.net");
16         schoolPage.setSchool("广西师范大学");
17         // 加入两页面,加入的顺序就是界面上显示的顺序
18         addPage(namePage);
19         addPage(schoolPage);
20     }
21
22     // 由此方法判断“完成”按钮何时有效。返回true则有效,false无效
23     public boolean canFinish() {
24         System.out.println("aa");
25         // 设置成:当还没到最后一页时“完成”按钮无效
26         if (this.getContainer().getCurrentPage() != schoolPage)
27             return false;
28         return super.canFinish();
29     }
30
31     // 当单击“完成”按钮退出向导时,将执行此方法
32     public boolean performFinish() {
33         // 取出各页面的值,并打印输出
34         System.out.println(namePage.getName());
35         System.out.println(namePage.getEmail());
36         System.out.println(schoolPage.getSchool());
37         return true;
38     }
39 }

程序说明:

向导式对话框在单击"下一步","上一步"按钮时都会执行canFinish方法来重置底部按钮的有效状态,因此canFinish方法中的代码的执行效率不要太低.

(3)创建两个继承自WizardPage类:NamePage和SchoolPage.在这两个类中创建页面上的界面组件,添加组件的设值和取值方法.NamePage页的代码如下,里面 有多次用到了Apache的Common软件包:

NamePage.java

 1 import org.apache.commons.lang.StringUtils;
 2 import org.apache.commons.validator.EmailValidator;
 3 import org.eclipse.jface.wizard.WizardPage;
 4 import org.eclipse.swt.SWT;
 5 import org.eclipse.swt.events.ModifyEvent;
 6 import org.eclipse.swt.events.ModifyListener;
 7 import org.eclipse.swt.layout.GridData;
 8 import org.eclipse.swt.layout.GridLayout;
 9 import org.eclipse.swt.widgets.Composite;
10 import org.eclipse.swt.widgets.Text;
11
12 public class NamePage extends WizardPage {
13     private String name;
14     private String email;
15     private Text nameText;
16     private Text emailText;
17
18     // 必须继承父类的构造函数
19     protected NamePage(String pageName) {
20         super(pageName);
21     }
22
23     // 改写自父类的方法,在此方法中构建页面上的界面组件。注意不要在传入参数parent基础直接创建界面元素,而应在一个新面板topComp上创建
24     public void createControl(Composite parent) {
25         // 每页的提示信息
26         setTitle("用户信息");
27         setMessage("请输入您的姓名及Email", INFORMATION);
28         // 创建一个页面组件的底层面板,并使用GridLayout布局
29         Composite topComp = new Composite(parent, SWT.NULL);
30         topComp.setLayout(new GridLayout());
31         // 创建“姓名”文本框
32         nameText = new Text(topComp, SWT.BORDER);
33         nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
34         // 将null转化成"",等效于 name== null ? "" : name
35         nameText.setText(StringUtils.defaultString(name));
36         // 创建“Email”文本框
37         emailText = new Text(topComp, SWT.BORDER);
38         emailText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
39         emailText.setText(StringUtils.defaultString(email));
40         // 给两文本框加入监听器
41         MyModifyListener listener = new MyModifyListener();
42         nameText.addModifyListener(listener);
43         emailText.addModifyListener(listener);
44         // 必须要的一行
45         setControl(topComp);
46     }
47
48     // 此监听器,每次文本框里的文本变动都会触发,触发频度较大
49     private class MyModifyListener implements ModifyListener {
50         public void modifyText(ModifyEvent e) {
51             setPageComplete(false); // 先使“完成”和“下一步”两按钮无效
52             // 用Apache Commons Lang的StringUtils可以检查出全角空格
53             name = nameText.getText().trim();// 设回实例变量name
54             if (StringUtils.isBlank(name)) {
55                 setErrorMessage("姓名不能为空"); // 提示错误信息
56                 return;
57             }
58             // 用了Apache Commons Validator的 EmailValidator来检查Email写法的合法性
59             EmailValidator validator = EmailValidator.getInstance();
60             email = emailText.getText().trim();// 设回实例变量email
61             if (!validator.isValid(email)) {
62                 setErrorMessage("Email的格式错误");
63                 return;
64             }
65             // 前面的检查都通过后......
66             setErrorMessage(null); // 消除对话框上的出错提示
67             setPageComplete(true); // 使“完成”和“下一步”两按钮可用
68         }
69     }
70
71     // --------相应的Setter/Getter方法 ---------------
72     public String getName() {
73         return name;
74     }
75
76     public void setName(String string) {
77         name = string;
78     }
79
80     public String getEmail() {
81         return email;
82     }
83
84     public void setEmail(String string) {
85         email = string;
86     }
87 }

程序说明:"不要重新发明轮子"是软件界的一句著名的俗语,Apache提供了很多所需的软件包,而且都经过了严格的测试和实践检验的,我们有什么理由自己再去写一遍重复的代码呢?示例中的EmailValidator,StringUtils都是Apache的Common工具集中的类,前者是Validator包的,后者是Lang包的.其中,Validator包还需要正规表达式的软件包,ORO的支持.

第二个页面SchoolPage.java的代码和前面的NamePage类似:

SchoolPage.java

 1 import org.apache.commons.lang.StringUtils;
 2 import org.eclipse.jface.wizard.WizardPage;
 3 import org.eclipse.swt.SWT;
 4 import org.eclipse.swt.events.ModifyEvent;
 5 import org.eclipse.swt.events.ModifyListener;
 6 import org.eclipse.swt.layout.GridData;
 7 import org.eclipse.swt.layout.GridLayout;
 8 import org.eclipse.swt.widgets.Composite;
 9 import org.eclipse.swt.widgets.Text;
10
11 public class SchoolPage extends WizardPage {
12     private String school;
13     private Text schoolText;
14
15     protected SchoolPage(String pageName) {
16         super(pageName);
17     }
18
19     public void createControl(Composite parent) {
20         // 每页的提示信息
21         setTitle("用户信息");
22         setMessage("请输入您的学校的名称", INFORMATION);
23         // 创建一个组件的底层面板,并使用GridLayout布局
24         Composite topComp = new Composite(parent, SWT.NULL);
25         topComp.setLayout(new GridLayout());
26         // 创建“学校”文本框
27         schoolText = new Text(topComp, SWT.BORDER);
28         schoolText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
29         schoolText.setText(StringUtils.defaultString(school));
30         schoolText.addModifyListener(new MyModifyListener());
31         this.setControl(topComp);// 必须要的一行
32     }
33
34     // 注释说明请参数NamePage页的监听器,两者现实相似。
35     private class MyModifyListener implements ModifyListener {
36         public void modifyText(ModifyEvent e) {
37             setPageComplete(false);
38             school = schoolText.getText().trim();
39             if (StringUtils.isBlank(school)) {
40                 setErrorMessage("学校名不能为空");
41                 return;
42             }
43             setErrorMessage(null);
44             setPageComplete(true);
45         }
46     }
47
48     // --------相应的Setter/Getter方法 ---------------
49     public String getSchool() {
50         return school;
51     }
52
53     public void setSchool(String string) {
54         school = string;
55     }
56 }

运行结果如下:

关于JFace中的向导式对话框(WizardDialog类)相关推荐

  1. 如何设计一个优秀的向导式界面(Wizard)

    软件界面设计中的"向导式界面"这个术语翻译自英语中的"Wizard"一词.大部分字典上对于Wizard的解释是男巫.奇才的意思.不过从其用途来看,似乎向导的译法 ...

  2. 在ObjectARX中使用MFC-标签式对话框

    先附上流程图: (1) 创建工程  (2)插入一个对话框 双击.rc文件 右键->选中添加资源 修改对话框ID:IDD_OPTION_SHEET 在上面添加一个Tab控件, 修改ID:IDC_T ...

  3. Swt/Jface中提供的dialog

    Swt/Jface中提供的dialog Swt/Jface中提供了各种各样的Dialog,一般情况下就能满足我们的需求,现在把这些dialog介绍一下, 下一篇文章再继续将如何自定义Dialog 一. ...

  4. 5弹出阴影遮罩_千文详述Cocos Creator弹出式对话框实现技术,着实硬核

    正文 在Cocos Creator游戏开发中,经常需要使用到弹出式对话框,下面我们就一起来封装下自己的弹出式对话框. 一.弹出式对话框原理解析 1:对话框的结构: 1. `根节点 -->`2. ...

  5. JFace中Dialog类的使用方法

    2019独角兽企业重金招聘Python工程师标准>>> cyper的例子: 注意dialog.open()返回Dialog.OK而不是SWT.OK 窗体代码: public clas ...

  6. Web开发中的弹出对话框控件介绍

    Web开发中,目前由于Jquery的大行其道,因此很多弹出对话框,都用到了Jquery技术,反而原始的弹出对话框的方式较为少用了.不过基于JQuery的方式实现对话框窗口弹出,也有很多控件可以利用,由 ...

  7. Android之AlertDialog(弹出式对话框)的使用

    一.简单的内容文本弹出式对话框 还是一样MainActivity的布局文件就不放上了,就是一个简单的Button控件,在Java代码中为其绑定了一个监听器. 首先我们需要创建这个AlertDialog ...

  8. MyBatis中使用流式查询避免数据量过大导致OOM

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天mybatis查询数据库中大量的数据,程序抛出: java.lang.OutOfMemoryError: Java heap s ...

  9. java链式编程_Java 中的链式编程

    前言 ​在写项目的时候,有一个实体类有好多个属性,new 出来之后需要不停的使用setXXX( )方法,效率低而且代码可读性差,查询了下发现可以实现实体类的链式编程. public class Use ...

最新文章

  1. dba mysql命令_Mysql常用DBA命令
  2. 20201125 《计算感知》武老师 第1节课 笔记
  3. 使用axis1.4生成webservice的客户端代码
  4. Asp.net在IIS6.0权限设置的问题,大牛进
  5. 初级Java开发面试必问项!!! 标识符、字面值、变量、数据类型,该学学了!
  6. 论文浅尝 | 基于未知谓词与实体类型知识图谱的 Zero-Shot 问题生成
  7. 【英语学习】【Level 07】U08 Old Stories L2 A good read
  8. nodejs 做后台的一个完整业务整理
  9. 编译原理(第3版)习题精选与解析(第三章部分解析)
  10. 入手Kindle DX
  11. java实现url编码与中文的互相转换
  12. 一位瑞典程序员的创业感悟
  13. idea报错:fatal: –author ‘user@mail.com’ is not ‘Name ’ and matches no existing author
  14. CHtmlView指定IE内核
  15. 文献检索报告软件测试,文献检索报告及文献综述.doc
  16. WEB——HTML、CSS、javascript
  17. remount of the / superblock failed: Permission denied remount failed
  18. 短信发送平台-阿里大于
  19. 非洲勒索软件、僵尸网络攻击有所增加——但在线诈骗仍构成最大威胁
  20. Arduino 一次性烧录引导程序和用户程序的方法

热门文章

  1. Android学习笔记(八)
  2. 机房收费系统-- MDI子窗体显示技巧
  3. 静态变量(static)
  4. 一个常见的asp.net错误解决
  5. 安卓学习之路之如何显示一个listview列表视图
  6. spring中@Value的使用(读取配置文件信息)
  7. SpringBoot中使用Hibernate Validator校验工具类
  8. java判断经纬度是否在扇形内_地理坐标是用经度
  9. 单人存档_电子发票归档怎么保存稳当?电子发票存档你都会了吗?
  10. Android 圆角TabLayout