如果您的向导实现复杂的任务,则您可能想要使用多个页面来获取来自用户的信息。
通常,实现模式是与单页面向导的实现模式是相同的。
设计向导时,最好是将所有必需的信息尽可能放在第一页上。这样,用户无需遍历整组页面就可以完成任务。可选信息可放在后续页面上。
如果仍然需要来自用户的输入才能认为完成了页面,则使用 setPageComplete(false) 来表示该页面是未完成的。当页面接收到来自其控件的事件时,它就会重新进行检查,以便了解该页面是否已完成。一旦提供了必需的输入,setPageComplete(true) 就会通知完成了页面。
Wizard 类处理根据页面的完成状态来启用和禁用完成按钮所需要的逻辑。仅当向导的每个页面都将其完成状态设置为 true 时,才会对该向导启用完成按钮。
类 WizardNewFileCreationPage 和 CreateReadme1 显示用于实现页面验证的常见模式。
WizardNewFileCreationPage 为用来验证页面的所有 SWT 事件定义常见的事件处理程序。这意味着,每当从页面向其添加侦听器的窗口小部件中接收到事件时,就将验证该页面。
public void handleEvent(Event event) { setPageComplete(validatePage()); }
一旦 ReadmeCreationPage 创建了它的控件,它就会使用 validatePage 设置页面的状态。
public void createControl(Composite parent) { super.createControl(parent); // create controls, add listeners, and layout the page ... // sample section generation checkboxes sectionCheckbox = new Button(group,SWT.CHECK); sectionCheckbox.setText(MessageUtil.getString("Generate_sample_section_titles")); sectionCheckbox.setSelection(true); sectionCheckbox.addListener(SWT.Selection,this); subsectionCheckbox = new Button(group,SWT.CHECK); subsectionCheckbox.setText(MessageUtil.getString("Generate_sample_subsection_titles")); subsectionCheckbox.setSelection(true); subsectionCheckbox.addListener(SWT.Selection,this); ... setPageComplete(validatePage()); }
通过使用此模式,向导页面就可以将它的所有页面验证代码都放在同一个方法 validatePage() 中。此方法确定页面的初始状态,并且每当从它的页面上的窗口小部件中接收到事件时,就会重新计算状态。
由于我们已经将侦听器添加到小节复选框中,因此,每当该复选框接收到选择事件时,我们就将重新计算该页面的有效状态。注意,必须优先调用页面的 handleEvent 方法,以确保除了为此页面处理任何特定事件之外,还会发生继承的页面验证行为。
public void handleEvent(Event e) { Widget source = e.widget; if (source == sectionCheckbox) { if (!sectionCheckbox.getSelection()) subsectionCheckbox.setSelection(false); subsectionCheckbox.setEnabled(sectionCheckbox.getSelection()); } super.handleEvent(e); }