多页面向导

如果您的向导实现复杂的任务,则您可能想要使用多个页面来获取来自用户的信息。

通常,实现模式是与单页面向导的实现模式是相同的。

设计向导时,最好是将所有必需的信息尽可能放在第一页上。这样,用户无需遍历整组页面就可以完成任务。可选信息可放在后续页面上。

如果仍然需要来自用户的输入才能认为完成了页面, 则使用 setPageComplete(false) 来表示该页面是未完成的。当页面接收到来自其控件的事件时,它就会重新进行检查,以便了解该页面是否已完成。一旦提供了必需的输入,setPageComplete(true) 就会通知完成了页面。

向导类处理根据页面的完成状态来启用和禁用完成按钮所需要的逻辑。仅当向导的每个页面都将其完成状态设置为 true 时,才会对该向导启用完成按钮。

验证和页面控件

WizardNewFileCreationPageCreateReadme1 显示用于实现页面验证的常见模式。

WizardNewFileCreationPage 为用来验证页面的所有 SWT 事件定义常见的事件处理程序。这意味着,每当从页面向其添加侦听器的小窗口中接收到事件时,就将验证该页面。

public void handleEvent(Event event) {
    setPageComplete(validatePage());
}

一旦 CreateReadme1 页面创建了它的控件,它就会使用 validatePage 来设置页面的状态。

public void createControl(Composite parent) {
    super.createControl(parent);
    // 创建控件、添加侦听器以及对页面布局
    ...
    // 样本小节生成复选框
    sectionCheckbox = new Button(group,SWT.CHECK);
    sectionCheckbox.setText("Generate sample section titles");
    sectionCheckbox.setSelection(true);

    // 将侦听器添加至此复选框
    sectionCheckbox.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);
}