2009-06-05 35 views
13

Tôi cần một trình hướng dẫn có nội dung trang thứ hai phụ thuộc vào lựa chọn của trang đầu tiên. Trang đầu tiên yêu cầu người dùng "loại" bộ lọc mà anh ta muốn tạo và người thứ hai yêu cầu người dùng tạo một cá thể bộ lọc của "loại" đã chọn.Trình hướng dẫn của Eclipse JFace

Nội dung trang của thủ thuật JFace (phương thức createControl (...)) được tạo khi thuật sĩ mở và không khi trang được hiển thị (điều này cho phép JFace biết kích thước thuật sĩ tôi đoán ??).

Vì điều này, tôi phải tạo nội dung trang thứ hai TRƯỚC KHI trình hướng dẫn được mở NHƯNG Tôi không thể vì nội dung của trang thứ hai phụ thuộc vào lựa chọn trang đầu tiên.

Hiện tại, giải pháp dọn dẹp tôi tìm thấy bao gồm trong việc tạo tất cả (giây) trang trước khi thuật sĩ mở (với nội dung của chúng) và ghi đè phương thức getNextPage() trong trang đầu tiên.

Hạn chế chính của giải pháp đó là có thể tốn kém khi có nhiều trang thứ hai để tạo.

Bạn nghĩ sao về giải pháp đó? Làm cách nào để bạn quản lý các trang của trình hướng dẫn? Có bất kỳ giải pháp sạch hơn mà tôi đã bỏ lỡ không?

Trả lời

9

Cách tiếp cận là đúng nếu bạn là một vài trang khác mà là

  • một hoàn toàn khác với một
  • phụ thuộc vào sự lựa chọn trước đó thực hiện trong một trang trước

Sau đó, bạn có thể add the next page dynamically (cũng như described here)

Nhưng nếu bạn chỉ có trang tiếp theo có nội dung động, bạn nên là ble để tạo ra rằng nội dung trong 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(); 
} 

Như thể hiện trong nhật thực góc bài viết Creating JFace Wizards:

Chúng ta có thể thay đổi thứ tự của các trang thuật sĩ bằng cách ghi đè phương pháp getNextPage của bất kỳ thuật sĩ page.Before bỏ rơi trang, chúng tôi lưu trong mô hình các giá trị do người dùng chọn. Trong ví dụ của chúng tôi, tùy thuộc vào lựa chọn đi lại mà người dùng sẽ tiếp theo xem trang có chuyến bay hoặc trang để đi du lịch bằng ô tô.

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

Chúng tôi xác định một phương pháp để làm khởi này cho PlanePage, onEnterPage() và chúng tôi gọi phương pháp này khi chuyển sang PlanePage, đó là trong phương pháp getNextPage() cho trang đầu tiên.

+0

Đây là một mô hình thực sự tốt đẹp, cảm ơn câu trả lời tuyệt vời! – rooftop

5

Nếu bạn muốn bắt đầu trình hướng dẫn mới dựa trên lựa chọn của bạn trên trang đầu tiên, bạn có thể sử dụng lớp cơ sở JFace org.eclipse.jface.wizard.WizardSelectionPage.

Ví dụ bên dưới hiển thị danh sách các trình hướng dẫn có sẵn được xác định bởi một điểm mở rộng. Khi bạn nhấn Tiếp theo, trình hướng dẫn đã chọn được bắt đầu.

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

} 

Lớp thuật sĩ tương ứng trông như thế này:

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

Tôi đã định dạng lại mã của bạn một chút, nếu bạn không thích nó - vui lòng quay lại. – MByD

0

tôi có một giải pháp khác nhau.

Nếu trang phụ thuộc vào kết quả của trang 1, tạo biến và chuyển nó vào trang đầu tiên, khi trang hướng dẫn đó có tùy chọn từ người dùng, thì điều cuối cùng trước khi đóng trang là đặt biến với giá trị yêu cầu.

Sau đó chuyển biến này cho trình hướng dẫn, sau đó chuyển nó đến trang thuật sĩ tiếp theo. Sau đó, làm một tuyên bố nếu đơn giản và theo cách đó bạn sẽ có được cả hai lựa chọn với nhau.

Hãy nhớ rằng trong hầu hết các mã, chỉ có một sự khác biệt nhỏ trong các tùy chọn người dùng, vì vậy hãy nhớ không bị lột xác khi sao chép mã của bạn.

1

Một giải pháp thay thế khác là @Override setVisible. Bạn có thể cập nhật giá trị trang hoặc thêm tiện ích bổ sung tại thời điểm đó.

Các vấn đề liên quan