Domanda

Ho bisogno di una procedura guidata il cui contenuto della seconda pagina dipenda dalla selezione della prima pagina.La prima pagina chiede all'utente il "tipo" di filtro che desidera creare e la seconda chiede all'utente di creare un'istanza di filtro del "tipo" selezionato.

I contenuti delle pagine della procedura guidata di JFace (metodo createControl(...)) vengono tutti creati quando la procedura guidata è aperta e non quando viene visualizzata una determinata pagina (questo consente a JFace di conoscere la dimensione della procedura guidata, immagino ??).

Per questo motivo, devo creare il contenuto della mia seconda pagina PRIMA che venga aperta la procedura guidata MA non posso poiché il contenuto della seconda pagina dipende dalla selezione della prima pagina.

Per ora la soluzione più pulita che ho trovato consiste nel creare tutte le pagine (secondi) prima dell'apertura della procedura guidata (con il loro contenuto) e sovrascrivere il metodo getNextPage() nell'implementazione della prima pagina.

Lo svantaggio principale di questa soluzione è che può essere costosa quando ci sono molte seconde pagine da creare.

Cosa ne pensi di quella soluzione?Come gestisci le pagine del tuo mago?C'è qualche soluzione più pulita che mi sono persa?

È stato utile?

Soluzione

L'approccio è giusto, se siete in più altre pagine che sono

  • uno completamente diverso con un altro
  • dipende dalle scelte precedenti fatte in una pagina precedente

Quindi è possibile aggiungere la pagina successiva in modo dinamico ( anche come descritto qui )

Ma se avete solo una pagina successiva con un contenuto dinamico, si dovrebbe essere in grado di creare contenuti che nel metodo 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();
}

Come mostrato nella eclisse angolo articolo Creazione JFace Wizards :

Possiamo cambiare l'ordine delle pagine della procedura guidata sovrascrivendo il metodo getNextPage di qualsiasi procedura guidata page.Before lasciare la pagina, risparmiamo nel modello i valori scelti dall'utente. Nel nostro esempio, a seconda della scelta del viaggio l'utente successivo visualizzare sia la pagina con i voli o la pagina per viaggiare in auto.

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

definire un metodo per fare questo di inizializzazione per il PlanePage, onEnterPage() e invochiamo questo metodo quando si spostano al PlanePage, cioè nel metodo getNextPage() per la prima pagina .

Altri suggerimenti

Se si desidera avviare una nuova procedura guidata in base alla selezione nella prima pagina, è possibile utilizzare la classe di base JFace org.eclipse .jface.wizard.WizardSelectionPage .

L'esempio seguente mostra un elenco di procedure guidate disponibili definiti da un punto di estensione. Quando si preme Avanti , viene avviata la procedura guidata selezionata.

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 di procedura guidata corrispondente appare così:

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

}
}

Un'altra alternativa è @Override setVisible.Puoi aggiornare i valori della pagina o aggiungere ulteriori widget in quel momento.

Ho una soluzione diversa.

Se la pagina dipende dal risultato della pagina 1, creare una variabile e passare in alla prima pagina, quando quella pagina della procedura guidata ha la possibilità da parte dell'utente, quindi l'ultima cosa prima che la pagina è chiusa è quello di impostare la variabile il valore richiesto.

Poi passare questa variabile procedura guidata, poi passarlo alla pagina successiva della procedura guidata. Poi fare una semplice istruzione if e in questo modo si ottiene entrambe le scelte insieme.

Ricordate che in maggior parte del codice c'è solo una piccola differenza nelle opzioni utente, in modo da ricordarsi di non impantanarsi nel duplicare il codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top