سؤال

أحتاج إلى معالج يعتمد محتوى الصفحة الثاني على اختيار الصفحة الأولى. تسأل الصفحة الأولى من المستخدم "النوع" من المرشح الذي يريد إنشاءه والثاني يسأل المستخدم إنشاء مثيل مرشح واحد من "النوع" المحدد.

يتم إنشاء جميع محتويات صفحات معالجات JFACE (CreationControl (...) طريقة) عند فتح المعالج وليس عند عرض صفحة معينة (السماح بمسح JFACE لمعرفة حجم المعالج، أعتقد؟).

ولهذا السبب، يجب علي إنشاء محتوى صفحتي الثاني قبل فتح المعالج ولكن لا يمكنني ذلك منذ أن يعتمد محتوى الصفحة الثانية على اختيار الصفحة الأولى.

في الوقت الحالي، يتكون الحل الأنظف الذي عثر عليه في إنشاء صفحات (ثانية) قبل فتح المعالج (مع محتواها) وتجاوز طريقة GetnextPage () في تطبيق الصفحة الأولى.

العيب الرئيسي لهذا الحل هو أنه قد يكون مكلفا عندما يكون هناك العديد من الصفحات الثانية لإنشاءها.

ما رأيك في هذا الحل؟ كيف تدير صفحات المعالج الخاص بك؟ هل هناك أي حل نظيف فاتني؟

هل كانت مفيدة؟

المحلول

النهج صحيح إذا كنت العديد من الصفحات الأخرى التي هي

  • مختلفة تماما مع آخر
  • يعتمد على الخيارات السابقة المقدمة في الصفحة السابقة

إذا تستطيع أضف الصفحة التالية ديناميكيا (أيضا كما الموصوف هنا)

ولكن إذا كان لديك صفحة التالية فقط مع محتوى ديناميكي، يجب أن تكون قادرا على إنشاء هذا المحتوى في 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();
}

كما هو موضح في مقال الركن الكسوف إنشاء معالجات JFACE.:

يمكننا تغيير ترتيب صفحات المعالج عن طريق الكتابة فوق طريقة GetnextPage لأي معالج صفحة "قبل أن تغادر الصفحة، نحفظها في النموذج القيم المختارة من قبل المستخدم. في مثالنا، اعتمادا على اختيار السفر سوف يرى المستخدم بعد ذلك الصفحة برحلات الطيران أو الصفحة للسفر بالسيارة.

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

نحن تحديد طريقة للقيام بهذا التهيئة ل PlanePage, onEnterPage() ونحن ندعح هذه الطريقة عند الانتقال إلى PlanePage, ، هذا في getNextPage() طريقة للصفحة الأولى.

نصائح أخرى

إذا كنت ترغب في بدء تشغيل معالج جديد بناء على اختيارك في الصفحة الأولى، فيمكنك استخدام الفئة الأساسية JFACE org.eclipse.jface.wizard.wizardelEctionpage..

يوضح المثال أدناه قائمة بالمعالجات المتاحة التي تحددها نقطة تمديد. عندما تضغط التالي, ، يتم بدء المعالج المحدد.

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

}

يبدو أن فئة المعالج المقابلة مثل هذا:

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

}
}

بديل آخر هو override مثبت. وبعد يمكنك تحديث قيم الصفحة أو إضافة عناصر واجهة مستخدم إضافية في ذلك الوقت.

لدي حل مختلف.

إذا كانت الصفحة تعتمد على نتيجة الصفحة 1، فقم بإنشاء متغير وتمريرها إلى الصفحة الأولى، عندما تحتوي صفحة المعالج هذه على خيار المستخدم من المستخدم، ثم يتم إغلاق آخر شيء قبل إغلاق الصفحة هو ضبط المتغير على القيمة المطلوبة وبعد

ثم قم بتمرير هذا المتغير إلى المعالج، ثم اجتازه إلى صفحة المعالج التالية. ثم قم ببيان بسيط إذا كانت هذه الطريقة التي تحصل عليها معا.

تذكر أنه في معظم التعليمات البرمجية لا يوجد سوى اختلاف صغير في خيارات المستخدم، لذلك تذكر عدم التخلص منه في تكرار الكود الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top