关于JFace中的向导式对话框(WizardDialog类)
向导式对话框是一种非常友好的界面,它能够引导用户一步步的输入信息.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
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell; public class WizardDialog1 {
public static void main(String[] args) {
Display display = Display.getDefault();
Shell shell = new Shell(display); WizardDialog dialog = new WizardDialog(shell, new MyWizard());
dialog.setPageSize(-1, 60); // dialog大小,-1是指让宽度自动调整
dialog.open(); display.dispose();
}
}
(2)WizardDialog用到的MyWizard类的代码如下:
MyWizard类主要是改写父类Wizard的3个方法:addPages.canFinish和performFinish.
在addPages方法中加入页面和为页面设置初始值:在canFinish方法中判断"完成"按钮是否可用,在performFinish方法中编写退出向导时候处理程序.
MyWizard.java
import org.eclipse.jface.wizard.Wizard;
public class MyWizard extends Wizard {
// 把两页面对象定义成实例变量,使其他方法能访问得到
private NamePage namePage;// 页面一,继承自WizardPage类
private SchoolPage schoolPage;// 页面二,继承自WizardPage类
// 在此方法将两页面加入并设置初值
public void addPages() {
// 创建页面对象,并设置页面的名称
namePage = new NamePage("namePage");
schoolPage = new SchoolPage("schoolPage");
// 设置页面的初始值
namePage.setName("陈刚");
namePage.setEmail("glchengang@yeah.net");
schoolPage.setSchool("广西师范大学");
// 加入两页面,加入的顺序就是界面上显示的顺序
addPage(namePage);
addPage(schoolPage);
}
// 由此方法判断“完成”按钮何时有效。返回true则有效,false无效
public boolean canFinish() {
System.out.println("aa");
// 设置成:当还没到最后一页时“完成”按钮无效
if (this.getContainer().getCurrentPage() != schoolPage)
return false;
return super.canFinish();
}
// 当单击“完成”按钮退出向导时,将执行此方法
public boolean performFinish() {
// 取出各页面的值,并打印输出
System.out.println(namePage.getName());
System.out.println(namePage.getEmail());
System.out.println(schoolPage.getSchool());
return true;
}
}
程序说明:
向导式对话框在单击"下一步","上一步"按钮时都会执行canFinish方法来重置底部按钮的有效状态,因此canFinish方法中的代码的执行效率不要太低.
(3)创建两个继承自WizardPage类:NamePage和SchoolPage.在这两个类中创建页面上的界面组件,添加组件的设值和取值方法.NamePage页的代码如下,里面 有多次用到了Apache的Common软件包:
NamePage.java
import org.apache.commons.lang.StringUtils;
import org.apache.commons.validator.EmailValidator;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text; public class NamePage extends WizardPage {
private String name;
private String email;
private Text nameText;
private Text emailText; // 必须继承父类的构造函数
protected NamePage(String pageName) {
super(pageName);
} // 改写自父类的方法,在此方法中构建页面上的界面组件。注意不要在传入参数parent基础直接创建界面元素,而应在一个新面板topComp上创建
public void createControl(Composite parent) {
// 每页的提示信息
setTitle("用户信息");
setMessage("请输入您的姓名及Email", INFORMATION);
// 创建一个页面组件的底层面板,并使用GridLayout布局
Composite topComp = new Composite(parent, SWT.NULL);
topComp.setLayout(new GridLayout());
// 创建“姓名”文本框
nameText = new Text(topComp, SWT.BORDER);
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// 将null转化成"",等效于 name== null ? "" : name
nameText.setText(StringUtils.defaultString(name));
// 创建“Email”文本框
emailText = new Text(topComp, SWT.BORDER);
emailText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
emailText.setText(StringUtils.defaultString(email));
// 给两文本框加入监听器
MyModifyListener listener = new MyModifyListener();
nameText.addModifyListener(listener);
emailText.addModifyListener(listener);
// 必须要的一行
setControl(topComp);
} // 此监听器,每次文本框里的文本变动都会触发,触发频度较大
private class MyModifyListener implements ModifyListener {
public void modifyText(ModifyEvent e) {
setPageComplete(false); // 先使“完成”和“下一步”两按钮无效
// 用Apache Commons Lang的StringUtils可以检查出全角空格
name = nameText.getText().trim();// 设回实例变量name
if (StringUtils.isBlank(name)) {
setErrorMessage("姓名不能为空"); // 提示错误信息
return;
}
// 用了Apache Commons Validator的 EmailValidator来检查Email写法的合法性
EmailValidator validator = EmailValidator.getInstance();
email = emailText.getText().trim();// 设回实例变量email
if (!validator.isValid(email)) {
setErrorMessage("Email的格式错误");
return;
}
// 前面的检查都通过后......
setErrorMessage(null); // 消除对话框上的出错提示
setPageComplete(true); // 使“完成”和“下一步”两按钮可用
}
} // --------相应的Setter/Getter方法 ---------------
public String getName() {
return name;
} public void setName(String string) {
name = string;
} public String getEmail() {
return email;
} public void setEmail(String string) {
email = string;
}
}
程序说明:"不要重新发明轮子"是软件界的一句著名的俗语,Apache提供了很多所需的软件包,而且都经过了严格的测试和实践检验的,我们有什么理由自己再去写一遍重复的代码呢?示例中的EmailValidator,StringUtils都是Apache的Common工具集中的类,前者是Validator包的,后者是Lang包的.其中,Validator包还需要正规表达式的软件包,ORO的支持.
第二个页面SchoolPage.java的代码和前面的NamePage类似:
SchoolPage.java
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text; public class SchoolPage extends WizardPage {
private String school;
private Text schoolText; protected SchoolPage(String pageName) {
super(pageName);
} public void createControl(Composite parent) {
// 每页的提示信息
setTitle("用户信息");
setMessage("请输入您的学校的名称", INFORMATION);
// 创建一个组件的底层面板,并使用GridLayout布局
Composite topComp = new Composite(parent, SWT.NULL);
topComp.setLayout(new GridLayout());
// 创建“学校”文本框
schoolText = new Text(topComp, SWT.BORDER);
schoolText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
schoolText.setText(StringUtils.defaultString(school));
schoolText.addModifyListener(new MyModifyListener());
this.setControl(topComp);// 必须要的一行
} // 注释说明请参数NamePage页的监听器,两者现实相似。
private class MyModifyListener implements ModifyListener {
public void modifyText(ModifyEvent e) {
setPageComplete(false);
school = schoolText.getText().trim();
if (StringUtils.isBlank(school)) {
setErrorMessage("学校名不能为空");
return;
}
setErrorMessage(null);
setPageComplete(true);
}
} // --------相应的Setter/Getter方法 ---------------
public String getSchool() {
return school;
} public void setSchool(String string) {
school = string;
}
}
运行结果如下:



关于JFace中的向导式对话框(WizardDialog类)的更多相关文章
- 关于JFace中的进度条对话框(ProgressMonitorDialog类)
在Windows操作系统中,最常用的进度条对话框就是文件复制时的弹出框,如果想让用户愉快的使用你开发 的软件,那么在执行某个较长时间的操作时候,就应该弹出一个进度条提示框,告诉用户程序正在做什么. 做 ...
- 关于JFace中的输入值(InputDialog)对话框类
格式: InputDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue, In ...
- 关于JFace中的对话框MessageDialog类等其它类型对话框
对话框是软件系统中最常用到的界面,对话框无处不在,从界面结构来说,对话框主要是由主体的界面组件和底部窗体按钮组成. 之前的例子中已经频繁的使用到了MessageDialog.openInformati ...
- 小技巧:在向导式页面设计中使用hidden型输入可以避免session的使用
在向导式页面设计中使用hidden型输入可以避免session的使用,从而减小内存开支. 在表单中使用隐藏输入类型<input type="hidden" name=&quo ...
- 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目
原文: 如何:使用 Visual Studio 中的一键式发布来部署 Web 应用程序项目 本主题介绍如何在以下产品中使用 一键式发布 发布(部署)Web 应用程序项目: Visual Studio ...
- 关于JFace的自定义对话框(Dialog类)
仅仅是使用MessageDialog,InputDialog等JFace中现成的对话框类是无法满足实际项目开发需要的. 很多时候都需要自己定制对话框,自定义对话框只要在Dialog类的基础上作扩展就行 ...
- [转]spring mvc注解方式实现向导式跳转页面
由于项目需要用到向导式的跳转页面效果,本项目又是用spring mvc实现的,刚开始想到用spring 的webflow,不过webflow太过笨重,对于我们不是很复杂的跳转来说好像有种“杀鸡焉用牛刀 ...
- Net中的反应式编程
Net中的反应式编程(Reactive Programming) 系列主题:基于消息的软件架构模型演变 一.反应式编程(Reactive Programming) 1.什么是反应式编程:反应式编程 ...
- WPF编程,C#中弹出式对话框 MessageBox 的几种用法。
原文:WPF编程,C#中弹出式对话框 MessageBox 的几种用法. 1.MessageBox.Show("Hello~~~~"); 最简单的,只显示提示信息. 2.Mes ...
随机推荐
- QT数据库使用案列【联系人】-- 使用sqlite和QStringListModel
[关于如何打包自己开发的程序为安装包,可以参考http://www.cnblogs.com/yuliyang/p/4242179.html] [简要功能介绍] 使用sqlite数据库和Qt搭建界面,实 ...
- MFC消息映射机制
1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...
- 进入IT行业,你后悔过吗?
问:你曾后悔进入 IT 行业吗?为什么? 也许你后悔做了IT,但是很希望你能用自己混IT界的惨痛经历给题主这样的后来人提个醒. 也许你庆幸做了IT,同样很希望能够看到同行朋友们的真诚交流. miao ...
- Spark系列(四)整体架构分析
架构流程图 说明 Driver端流程说明(Standalone模式) 使用spark-submit提交Spark应用程序Application. 通过反射的方式创建和构造一个DriverActor进 ...
- ffmpeg 的tutorial
可能是新的: https://github.com/chelyaev/ffmpeg-tutorial https://github.com/chelyaev/ffmpeg-tutorial.git 老 ...
- HDU2296——Ring(AC自动机+DP)
题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...
- Memcached使用笔记
1.linux启动memcached命令 进入到memcached安装目录,可以用whereis memcached查看,默认安装在/usr/bin/目录下 输入以下命令,下面两行任选一行就可以了 m ...
- Java网络编程(URL&URLConnection)
package cn.itcast.net.p2.ie_server; import java.io.IOException; import java.io.InputStream; import j ...
- 远程控制篇:在DELPHI程序中拨号上网
用MODEM拨号上网,仍是大多数个人网民选择上网的方式.如果能在我们的应用程序中启动拨号连接(如IE浏览器程序中的自动拨号功能),无疑将会方便我们的软件用户(不用再切换应用程序,运行拨号网络),提高我 ...
- python 定义函数
在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...