2009-06-05 4 views
13

मुझे एक जादूगर की आवश्यकता है जो दूसरी पृष्ठ सामग्री पहले पृष्ठ के चयन पर निर्भर करती है। पहला पृष्ठ उपयोगकर्ता को "दयालु" फ़िल्टर बनाता है जिसे वह बनाना चाहता है और दूसरा उपयोगकर्ता चयनित "दयालु" का एक फ़िल्टर उदाहरण बनाने के लिए कहता है।ग्रहण जेएफएएस के विज़ार्ड

जेएफएएस के विज़ार्ड पेज सामग्री (createControl (...) विधि) जब विज़ार्ड खुला होता है और जब कोई दिया गया पृष्ठ प्रदर्शित नहीं होता है (यह जेएफएएस को जादूगर आकार को जानने की अनुमति देता है तो मुझे लगता है ??)।

इस वजह से, मुझे अपना दूसरा पृष्ठ सामग्री बनाना होगा इससे पहले कि विज़ार्ड खोला जाए लेकिन मैं दूसरे पेज की सामग्री के पहले पेज चयन पर निर्भर नहीं हूं।

अब के लिए क्लीनर समाधान मिला है जिसमें विज़ार्ड खुला है (उनकी सामग्री के साथ) और पहले पृष्ठ के कार्यान्वयन में getNextPage() विधि को ओवरराइड करने से पहले सभी (सेकंड) पृष्ठ बनाने में शामिल हैं।

उस समाधान का मुख्य दोष यह है कि यह महंगा हो सकता है जब कई दूसरे पृष्ठ बनाने के लिए महंगा हो।

आप उस समाधान के बारे में क्या सोचते हैं? आप अपने जादूगर के पृष्ठों का प्रबंधन कैसे करते हैं? क्या कोई क्लीनर समाधान याद आया है?

उत्तर

9

दृष्टिकोण सही है अगर आप कई अन्य पृष्ठों जो एक और

  • साथ

    • पूरी तरह से अलग कर रहे हैं पिछले एक पिछले पृष्ठ

    तो फिर तुम add the next page dynamically कर सकते हैं में किए गए विकल्पों पर निर्भर करता है कर रहे हैं (described here के रूप में भी)

    लेकिन यदि आपके पास गतिशील सामग्री वाला अगला पृष्ठ है, तो आपको एक होना चाहिए

    हम किसी भी जादूगर page.Before की getNextPage विधि अधिलेखन को छोड़ कर जादूगर पृष्ठों का क्रम बदल सकते हैं: के रूप में ग्रहण कोने लेख Creating JFace Wizards में दिखाया गया onEnterPage() method

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

    में है कि सामग्री बनाने के लिए ble पेज, हम मॉडल में उपयोगकर्ता द्वारा चुने गए मानों को सहेजते हैं। हमारे उदाहरण में, यात्रा की पसंद के आधार पर उपयोगकर्ता अगली बार उड़ान के साथ पृष्ठ या कार द्वारा यात्रा के लिए पृष्ठ देखेंगे।

    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() विधि में है।

  • +0

    यह वास्तव में एक अच्छा पैटर्न है, महान जवाब के लिए धन्यवाद! – rooftop

    5

    यदि आप पहले पृष्ठ पर अपने चयन के आधार पर एक नया जादूगर शुरू करना चाहते हैं, तो आप जेएफएएस बेस क्लास org.eclipse.jface.wizard.WizardSelectionPage का उपयोग कर सकते हैं।

    नीचे दिया गया उदाहरण एक विस्तार बिंदु द्वारा परिभाषित उपलब्ध विज़ार्ड की एक सूची दिखाता है। जब आप अगला दबाते हैं, तो चयनित विज़ार्ड प्रारंभ होता है।

    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); 
    
    } 
    } 
    
    +0

    यदि आपने इसे पसंद नहीं किया है तो मैंने आपके कोड को थोड़ा सा सुधार दिया है - कृपया रोलबैक करें। – MByD

    0

    मैं एक अलग समाधान है।

    यदि पृष्ठ पृष्ठ 1 के परिणाम पर निर्भर करता है, तो एक चर बनाएं और इसे पहले पृष्ठ पर पास करें, जब उस विज़ार्ड पृष्ठ में उपयोगकर्ता से विकल्प होता है, तो पृष्ठ बंद होने से पहले आखिरी चीज़ चर सेट करने के लिए होती है आवश्यक मूल्य के लिए।

    फिर इस चर को विज़ार्ड में पास करें, फिर इसे अगले विज़ार्ड पेज पर पास करें। फिर कथन के साथ एक सरल करें और इस तरह आप दोनों विकल्पों को एक साथ प्राप्त करते हैं।

    याद रखें कि अधिकांश कोड में उपयोगकर्ता विकल्पों में केवल एक छोटा सा अंतर होता है, इसलिए याद रखें कि अपने कोड को डुप्लिकेट करने में उलझन न लें।

    1

    एक और विकल्प @Override setVisible पर है। आप उस समय पृष्ठ मान अपडेट कर सकते हैं या अतिरिक्त विजेट जोड़ सकते हैं।