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;
}
我们
定义了一种方法来对此进行初始化PlanePage
,onEnterPage()
并在移至时调用此方法PlanePage
,即在getNextPage()
第一页的方法中。