Вопрос

Мне нужен мастер, содержимое второй страницы которого зависит от выбора первой страницы.Первая страница спрашивает пользователя, какой «тип» фильтра он хочет создать, а вторая просит пользователя создать один экземпляр фильтра выбранного «типа».

Содержимое страниц мастеров 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() метод для первой страницы.

Другие советы

Если вы хотите запустить новый мастер на основе вашего выбора на первой странице, вы можете использовать базовый класс JFace. org.eclipse.jface.wizard.WizardSelectionPage.

В приведенном ниже примере показан список доступных мастеров, определенных точкой расширения.Когда вы нажимаете Следующий, выбранный мастер запускается.

public class ModelSetupWizardSelectionPage extends WizardSelectionPage {

private ComboViewer providerViewer;
private IConfigurationElement selectedProvider;

public ModelSetupWizardSelectionPage(String pageName) {
    super(pageName);
}

private class WizardNode implements IWizardNode {
    private IWizard wizard = null;
    private IConfigurationElement configurationElement;

    public WizardNode(IConfigurationElement c) {
        this.configurationElement = c;
    }

    @Override
    public void dispose() {

    }

    @Override
    public Point getExtent() {
        return new Point(-1, -1);
    }

    @Override
    public IWizard getWizard() {
        if (wizard == null) {
            try {
                wizard = (IWizard) configurationElement
                        .createExecutableExtension("wizardClass");
            } catch (CoreException e) {

            }
        }
        return wizard;
    }

    @Override
    public boolean isContentCreated() {
        // TODO Auto-generated method stub
        return wizard != null;
    }

}

@Override
public void createControl(Composite parent) {
    setTitle("Select model provider");
    Composite main = new Composite(parent, SWT.NONE);
    GridLayout gd = new GridLayout(2, false);
    main.setLayout(gd);
    new Label(main, SWT.NONE).setText("Model provider");
    Combo providerList = new Combo(main, SWT.NONE);
    providerViewer = new ComboViewer(providerList);
    providerViewer.setLabelProvider(new LabelProvider() {
        @Override
        public String getText(Object element) {
            if (element instanceof IConfigurationElement) {
                IConfigurationElement c = (IConfigurationElement) element;
                String result = c.getAttribute("name");
                if (result == null || result.length() == 0) {
                    result = c.getAttribute("class");
                }
                return result;
            }
            return super.getText(element);
        }

    });
    providerViewer
            .addSelectionChangedListener(new ISelectionChangedListener() {
                @Override
                public void selectionChanged(SelectionChangedEvent event) {
                    ISelection selection = event.getSelection();
                    if (!selection.isEmpty()
                            && selection instanceof IStructuredSelection) {
                        Object o = ((IStructuredSelection) selection)
                                .getFirstElement();
                        if (o instanceof IConfigurationElement) {
                            selectedProvider = (IConfigurationElement) o;
                            setMessage(selectedProvider.getAttribute("description"));
                            setSelectedNode(new WizardNode(selectedProvider));
                        }
                    }

                }
            });
    providerViewer.setContentProvider(new ArrayContentProvider());
    List<IConfigurationElement> providers = new ArrayList<IConfigurationElement>();
    IExtensionRegistry registry = Platform.getExtensionRegistry();
    IExtensionPoint extensionPoint = registry
            .getExtensionPoint(<your extension point namespace>,<extension point name>);
    if (extensionPoint != null) {
        IExtension extensions[] = extensionPoint.getExtensions();
        for (IExtension extension : extensions) {
            IConfigurationElement configurationElements[] = extension
                    .getConfigurationElements();
            for (IConfigurationElement c : configurationElements) {
                providers.add(c);
            }
        }
    }
    providerViewer.setInput(providers);
    setControl(main);

}

Соответствующий класс мастера выглядит следующим образом:

 public class ModelSetupWizard extends Wizard {

private ModelSetupWizardSelectionPage wizardSelectionPage;

public ModelSetupWizard() {
    setForcePreviousAndNextButtons(true);
}

@Override
public boolean performFinish() {
            // Do what you have to do to finish the wizard
    return true;
}

@Override
public void addPages() {
    wizardSelectionPage = new ModelSetupWizardSelectionPage("Select a wizard");
    addPage(wizardSelectionPage);

}
}

Другая альтернатива — @Override setVisible.Одновременно вы можете обновить значения страницы или добавить дополнительные виджеты.

У меня есть другое решение.

Если страница зависит от результата страницы 1, создайте переменную и передайте ее на первую страницу, когда на этой странице мастера есть опция от пользователя, то последнее, что нужно сделать перед закрытием страницы, — это установить для переменной необходимое значение. .

Затем передайте эту переменную мастеру, а затем передайте ее на следующую страницу мастера.Затем выполните простой оператор if и таким образом вы получите оба варианта вместе.

Помните, что в большинстве кодов есть лишь небольшая разница в пользовательских опциях, поэтому не увязайте в дублировании кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top