Question

J'ai besoin d'un assistant qui seconde le contenu de la page dépend de la sélection de la première page. La première page demande à l'utilisateur le « type » de filtre, il veut créer et la deuxième demande à l'utilisateur de créer une instance de filtre sélectionné « type ».

Magiciens de JFace pages contenu (méthode CreateControl (...)) sont tous créés lorsque l'Assistant est ouvert et non quand une page donnée est affichée (cela permet JFace de connaître la taille de l'assistant, je suppose ??).

En raison de cela, je dois créer mon deuxième contenu de la page avant que l'Assistant est ouvert mais je ne peux pas, puisque le contenu de la deuxième page dépend de la première sélection de page.

Pour l'instant les pages solution plus propre que j'ai trouvé consiste à créer tous les (secondes) avant que l'Assistant est ouvert (avec leur contenu) et passer outre la méthode getNextPage () dans la mise en œuvre de la première page.

Le principal inconvénient de cette solution est qu'il peut être être cher quand il y a beaucoup de secondes pages pour créer.

Que pensez-vous de cette solution? Comment gérez-vous les pages de votre assistant? Y at-il une solution plus propre que je manqué?

Était-ce utile?

La solution

L'approche est juste si vous êtes plusieurs autres pages qui sont

  • complètement différent avec un autre
  • dépend des choix précédents effectués dans une page précédente

Ensuite, vous pouvez ajouter la page suivante dynamique ( aussi décrit ici )

Mais si vous avez juste une page suivante avec un contenu dynamique, vous devriez être en mesure de créer ce contenu dans le méthode de 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();
}

Comme le montre l'article coin éclipse Création JFace assistants :

Nous pouvons changer l'ordre des pages de l'assistant en réécrivant la méthode getNextPage de tout assistant page.Before quitter la page, nous enregistrons dans le modèle les valeurs choisies par l'utilisateur. Dans notre exemple, selon le choix de Voyage, l'utilisateur suivant voir soit la page des vols ou la page pour les voyages en voiture.

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

définir une méthode pour faire cette initialisation pour la PlanePage, onEnterPage() et nous invoquons cette méthode lors du passage à la PlanePage, qui est dans la méthode getNextPage() pour la première page .

Autres conseils

Si vous voulez commencer un nouvel assistant en fonction de votre sélection sur la première page, vous pouvez utiliser la classe de base JFace org.eclipse .jface.wizard.WizardSelectionPage .

L'exemple ci-dessous montre une liste des assistants disponibles définis par un point d'extension. Lorsque vous appuyez sur Suivant , l'assistant sélectionné est démarré.

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

}

La classe ressemble à l'assistant correspondant ceci:

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

}
}

Une autre alternative consiste à @Override setVisible . Vous pouvez mettre à jour les valeurs de page ou ajouter des widgets supplémentaires à ce moment-là.

J'ai une autre solution.

Si la page dépend du résultat de la page 1, créez une variable et passer dans la première page, lorsque cette page de l'assistant a l'option de l'utilisateur, puis la dernière chose avant que la page est fermée consiste à définir la variable la valeur requise.

Passez ensuite cette variable à l'Assistant, puis passez à la page suivante de l'assistant. Ensuite, faites simple instruction if et de cette façon vous obtenez deux choix ensemble.

Rappelez-vous que dans la plupart du code il n'y a qu'une petite différence dans les options de l'utilisateur, donc rappelez-vous de ne pas se perdre dans la duplication de votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top