Pregunta

Necesito un asistente que el segundo contenido de la página depende de la selección de la primera página. La primera página le pide al usuario el "tipo" de filtro que quiere crear y la segunda pregunta al usuario para crear una instancia de filtro de la "clase" seleccionado.

magos páginas de contenidos JFace (método CreateControl (...)) son creados cuando el asistente está abierto y no cuando se visualiza una página determinada (esto permite JFace para saber el tamaño asistente supongo ??).

Debido a esto, tengo que crear mi segundo contenido de la página antes de abrir el asistente pero no puedo ya que el contenido de la segunda página depende de la primera selección de páginas.

Por ahora la solución más limpia que encontré consiste en la creación de todas las páginas (segundos) antes de que el asistente está abierta (con su contenido) y reemplazar el método getNextPage () en la ejecución de la primera página.

El principal inconveniente de esta solución es que se puede ser caro cuando hay muchos segunda página para crear.

¿Qué opinas sobre esa solución? ¿Cómo gestionar las páginas de su asistente? ¿Hay alguna solución más limpia que me perdí?

¿Fue útil?

Solución

El enfoque es correcto si usted es varias otras páginas que son

  • uno completamente diferente con otro
  • depende de las opciones anteriores realizadas en una página anterior

A continuación, puede añadir la siguiente página dinámicamente ( también como descrito aquí )

Sin embargo, si usted tiene sólo un lado con una página de contenido dinámico, que debe ser capaz de crear ese contenido en el 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 se muestra en el eclipse esquina artículo Creación JFace Wizards :

Podemos cambiar el orden de las páginas del asistente al sobrescribir el método getNextPage de cualquier asistente page.Before salir de la página, se guarda en el modelo de los valores elegidos por el usuario. En nuestro ejemplo, dependiendo de la elección de los viajes que el usuario verá la próxima sea la página con los vuelos o la página para viajar en coche.

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

define un método para hacer esto de inicialización para el PlanePage, onEnterPage() y nos invocar este método cuando se mueve a la PlanePage, es decir en el método getNextPage() para la primera página .

Otros consejos

Si desea iniciar un nuevo asistente basado en su selección en la primera página, puede utilizar la clase base JFace org.eclipse .jface.wizard.WizardSelectionPage .

El ejemplo siguiente muestra una lista de asistentes disponibles definidas por un punto de extensión. Cuando se presiona Siguiente , se iniciará el Asistente seleccionado.

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 clase correspondiente asistente tiene este aspecto:

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

}
}

Otra alternativa es @ Override setVisible . Puede actualizar los valores de página o añadir widgets adicionales en ese momento.

Tengo una solución diferente.

Si la página depende del resultado de la página 1, cree una variable y se pasa dentro a la primera página, cuando esa página del asistente tiene la opción del usuario, a continuación, la última cosa antes de que la página es cerrado es para establecer la variable de el valor requerido.

A continuación, pasar a esta variable asistente, a continuación, pasar a la siguiente página del asistente. A continuación, hacer una simple instrucción if y de esa manera se obtiene ambas opciones juntas.

Recuerde que en la mayoría de código sólo hay una pequeña diferencia en las opciones de usuario, así que recuerde de no estancarse en duplicar su código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top