Pergunta

Eu preciso de um assistente que segundo o conteúdo da página depende da escolha da primeira página. A primeira página pede ao usuário o "tipo" de filtro, ele quer criar ea segunda pede ao usuário para criar uma instância de filtro do selecionado "tipo".

JFace de assistentes páginas conteúdos (CreateControl (...) método) são criados quando o assistente é aberto e não quando uma determinada página é exibida (isto permite que JFace saber o tamanho assistente Acho ??).

Devido a isso, eu tenho que criar minha segunda conteúdo da página antes de o assistente é aberto mas não posso desde o conteúdo da segunda página depende da primeira seleção página.

Por agora, a solução mais limpa eu encontrei consiste na criação de todas (segundos) páginas antes de o assistente é aberto (com o seu conteúdo) e substituir o método getNextPage () na implementação da primeira página.

A principal desvantagem dessa solução é que ele pode ser ser caro quando existem muitas segundas páginas para criar.

O que você acha sobre essa solução? Como você gerenciar as páginas do seu assistente? Existe alguma solução mais limpa que eu perdi?

Foi útil?

Solução

A abordagem é certa, se você várias outras páginas que são

  • um completamente diferente com outro
  • depende das escolhas anteriores feitas em uma página anterior

Depois, você pode adicionar a próxima página dinamicamente ( também como descrito aqui )

Mas se você tem apenas uma página seguinte com um conteúdo dinâmico, você deve ser capaz de criar esse conteúdo no método 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();
}

Como mostrado no artigo canto eclipse Criando JFace assistentes :

Nós podemos mudar a ordem das páginas do assistente, substituindo o método getNextPage de qualquer page.Before assistente sair da página, poupamos no modelo os valores escolhidos pelo usuário. No nosso exemplo, dependendo da escolha do curso o usuário próximo verão a página com vôos ou a página para viajar de carro.

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;
}

definir um método para fazer isso de inicialização para o PlanePage, onEnterPage() e invocamos este método quando se deslocam para o PlanePage, que está no método getNextPage() para a primeira página .

Outras dicas

Se você deseja iniciar um novo assistente com base na sua seleção na primeira página, você pode usar a classe base JFace org.eclipse .jface.wizard.WizardSelectionPage .

O exemplo a seguir mostra uma lista de assistentes disponíveis definidas por um ponto de extensão. Quando você pressiona Próximo , o assistente selecionado é iniciado.

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);

}

Os correspondentes aparência de classe assistente como este:

 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);

}
}

Outra alternativa é @Override setVisible . Você pode atualizar valores de página ou adicionar widgets adicionais nesse momento.

Eu tenho uma solução diferente.

Se a página depende do resultado da página 1, criar uma variável e passá-lo para a primeira página, quando essa página do assistente tem a opção do usuário, então a última coisa antes que a página é fechada é definir a variável para o valor necessário.

Em seguida, passe esta variável para assistente, em seguida, passá-lo para a próxima página do assistente. Em seguida, fazer uma simples declaração se e de que maneira você tem as duas opções em conjunto.

Lembre-se que na maioria código existe apenas uma pequena diferença nas opções de usuário, então não se esqueça de se atolar em duplicar o seu código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top