Eclipse JFace的向导


问题内容

我需要一个向导,该向导的第二页内容取决于第一页的选择。第一页询问用户要创建的过滤器的“种类”,第二页询问用户创建所选“种类”的过滤器实例。

JFace的向导页面内容(createControl(…)方法)都是在打开向导时创建的,而不是在显示给定页面时创建的(这使JFace知道我猜是向导的大小)。

因此,在打开向导之前,我必须创建第二页内容,但是我无法创建,因为第二页的内容取决于第一页的选择。

现在,我发现的更干净的解决方案包括在打开向导之前创建所有(第二个)页面(及其内容),并在第一页的实现中覆盖getNextPage()方法。

该解决方案的主要缺点是,当要创建许多第二页时,它可能会很昂贵。

您如何看待该解决方案?您如何管理向导页面?我错过了任何更清洁的解决方案吗?


问题答案:

如果您在其他几个页面上

  • 彼此完全不同
  • 取决于上一页中的先前选择

然后,您可以动态添加下一页(也如此处所述

但是,如果只有下一页包含动态内容,则应该可以在方法中创建该内容onEnterPage()

public void createControl(Composite parent)
{
    //
    // create the composite to hold the widgets
    //
    this.composite = new Composite(parent, SWT.NONE);

    //
    // create the desired layout for this wizard page
    //
    GridLayout layout = new GridLayout();
    layout.numColumns = 4;
    this.composite.setLayout(layout);

    // set the composite as the control for this page
    setControl(this.composite);
}

void onEnterPage()
{
    final MacroModel model = ((MacroWizard) getWizard()).model;
    String selectedKey = model.selectedKey;
    String[] attrs = (String[]) model.macroMap.get(selectedKey);

    for (int i = 0; i < attrs.length; i++)
    {
        String attr = attrs[i];
        Label label = new Label(this.composite, SWT.NONE);
        label.setText(attr + ":");

        new Text(this.composite, SWT.NONE);
    }
    pack();
}

如日食专栏文章“
创建JFace向导”所示

我们可以通过覆盖任何向导页面的getNextPage方法来更改向导页面的顺序。在离开页面之前,我们将用户选择的值保存在模型中。在我们的示例中,根据旅行的选择,用户接下来将看到带航班的页面或乘车旅行的页面。

public IWizardPage getNextPage(){
   saveDataToModel();       
   if (planeButton.getSelection()) {
       PlanePage page = ((HolidayWizard)getWizard()).planePage;
     page.onEnterPage();
       return page;
   }
   // Returns the next page depending on the selected button
   if (carButton.getSelection()) { 
    return ((HolidayWizard)getWizard()).carPage;
   }
   return null;
}

我们
定义了一种方法来对此进行初始化PlanePageonEnterPage()并在移至时调用此方法PlanePage,即在getNextPage()第一页的方法中