Frage

Ich brauche einen Assistenten, die zweite Seiteninhalt auf der ersten Seite des Auswahl abhängt. Die erste Seite fragt den Benutzer, die „Art“ des Filters, er will schaffen und die zweite fordert den Benutzer auf eine Filterinstanz der ausgewählten „Art“.

erstellen

JFace Wizards Seiten Inhalt (create (...) Methode) werden alle erstellt, wenn der Assistent geöffnet ist, und nicht, wenn eine bestimmte Seite angezeigt wird (dies erlaubt JFace die Assistenten Größe zu wissen, ich denke, ??).

Aus diesem Grunde hat ich meinen zweiten Seiteninhalt erstellen, bevor der Assistent geöffnet wird, aber ich kann nicht, da die Inhalt der zweiten Seite ist abhängig von der ersten Seite Auswahl.

Für jetzt die sauberere Lösung I besteht Seiten nach der Erstellung aller (s) gefunden, bevor der Assistent geöffnet ist (mit ihrem Inhalt) und überschreibt den getNextPage () -Methode in der Umsetzung der ersten Seite.

Der Hauptnachteil dieser Lösung ist, dass es teuer werden kann, wenn es viele zweiten Seiten zu erstellen.

Was denken Sie über diese Lösung? Wie schätzen Sie Ihre Assistenten Seiten verwalten? Gibt es eine sauberere Lösung, die ich verpasst?

War es hilfreich?

Lösung

Der Ansatz ist richtig, wenn Sie mehrere andere Seiten, die sind

sind
  • ganz anderes mit einem anderen
  • hängt von den vorherigen Entscheidungen in einer vorherigen Seite gemacht

Dann können Sie fügen Sie die nächste Seite dynamisch ( auch als hier beschrieben)

Aber wenn Sie nur eine Seite weiter mit einem dynamischen Inhalt haben, sollten Sie in der Lage, diese Inhalte in der onEnterPage() Methode

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

Wie in der Eclipse-Ecke Artikel Erstellen JFace Wizards :

Wir können die Reihenfolge der Seiten des Assistenten ändern, indem die getNextPage Verfahren nach einem Assistenten überschreibt page.Before die Seite verlassen, speichern wir in dem Modell der vom Benutzer gewählten Werte. In unserem Beispiel je nach der Wahl der Reise wird der Benutzer der nächste Mal sieht entweder die Seite mit Flügen oder der Seite für Reisen mit dem 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;
}

Wir eine Methode definiert diese Initialisierung für die PlanePage, onEnterPage() zu tun, und wir rufen Sie diese Methode, wenn auf den PlanePage bewegt, ist, dass in der getNextPage() Methode für die erste Seite .

Andere Tipps

Wenn Sie einen neuen Assistenten für die Wahl auf der ersten Seite basierend starten möchten, können Sie die JFace Basisklasse verwenden org.eclipse .jface.wizard.WizardSelectionPage .

Das folgende Beispiel zeigt eine Liste der verfügbaren Assistenten durch einen Erweiterungspunkt definiert. Wenn Sie die Taste Weiter wird der ausgewählte Assistent gestartet.

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

}

Die entsprechende Experten-Klasse sieht wie folgt aus:

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

}
}

Eine weitere Alternative ist zu @Override setVisible . Sie können die Seiten Wert aktualisieren oder zusätzliche Widgets zu diesem Zeitpunkt hinzufügen.

Ich habe eine andere Lösung.

Wenn Seite auf dem Ergebnis der Seite 1 abhängt, eine Variable erstellen und gibt es in der ersten Seite, wenn die Seite des Assistenten die Option aus dem Benutzer hat, dann ist das letzte, was vor der Seite geschlossen ist, um die Variable auf der gewünschte Wert.

Dann diese Variable übergeben, um den Assistenten, dann geben sie auf die nächste Seite des Assistenten. Dann eine einfache tun if-Anweisung und auf diese Weise Sie zusammen beide Wahlen erhalten.

Beachten Sie, dass in den meisten Code gibt es nur einen kleinen Unterschied in den Benutzeroptionen, so erinnere mich nicht in das Duplizieren Code verzetteln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top