使用向导和ScrolledForm(jface和表单api)

时间:2013-09-12 10:50:30

标签: java eclipse swt eclipse-rcp jface

我是eclipse插件的新手 - SWT开发。我正在尝试创建包含多个文本字段和组合框的向导页面。为了更好看,我觉得我正在尝试使用FormToolkit创建组件并将其添加到ScrolledForm中。但是在运行时没有任何内容在向导页面上呈现,也没有错误。 问题:

  1. 是否可以在向导页面中滚动容器?
  2. 我们可以混合JFace并形成api吗? (删除了不需要的代码) 这是向导页面代码:

    公共类ContactWizardPage扩展WizardPage {     private static int counter;     私人表格;

    public ContactWizardPage() {        
        super("New Contact Wizard" + ++counter, "New Contact Wizard" + counter, null);
        setMessage("Please enter contact info." + counter);
    }
    
    public void createControl(final Composite parent) {
        createControlWithoutToolkit(parent);
        // commenting out toolkit code
    

    // createControlWithToolkit(parent);     }

    public void createControlWithoutToolkit(final Composite parent) {
    
        Composite composite = new Composite(parent, SWT.DEFAULT);
        composite.setLayout(new GridLayout(2, true));
    
    
        Label lblFirstName = new Label(composite, SWT.FLAT);
        lblFirstName.setText("First Name");
    
        Label lblLastName = new Label(composite, SWT.FLAT);
        lblLastName.setText("Last Name");
    
        Text txtFirstName = new Text(composite, SWT.FLAT);      
    
        Text txtLastName = new Text(composite, SWT.FLAT);
    
        Label lblEmail = new Label(composite, SWT.FLAT);
        lblEmail.setText("Email");
        GridDataFactory.swtDefaults().span(2, 1).align(
            SWT.FILL, 
            SWT.BEGINNING).applyTo(lblEmail); 
    
        Text txtEmail = new Text(composite, SWT.FLAT);
           GridDataFactory.swtDefaults().span(2, 1).align(
            SWT.FILL, 
            SWT.BEGINNING).applyTo(txtEmail); 
    
        setControl(composite);      
    }   
    
    public void createControlWithToolkit(final Composite parent) {
    
        FormToolkit toolkit = new FormToolkit(Display.getCurrent());
    
        ScrolledForm form = toolkit.createScrolledForm(parent);
    
        Composite composite = form.getBody();
        composite.setLayout(new GridLayout(2, true));
    
        Label lblFirstName = toolkit.createLabel(composite, "First Name");
    
        Label lblLastName = toolkit.createLabel(composite, "Last Name");
    
        Text txtFirstName = toolkit.createText(composite, "");
    
        Text txtLastName = toolkit.createText(composite, "");
    
        Label lblEmail = toolkit.createLabel(composite, "Email");
        GridDataFactory.swtDefaults().span(2, 1).align(
            SWT.FILL, 
            SWT.BEGINNING).applyTo(lblEmail); 
    
        Text txtEmail = toolkit.createText(composite, "");
           GridDataFactory.swtDefaults().span(2, 1).align(
            SWT.FILL, 
            SWT.BEGINNING).applyTo(txtEmail); 
    
        setControl(composite);      
    }
    

    }

  3. 这是向导代码:

    public class SampleNewWizard extends Wizard implements INewWizard {
    
    public SampleNewWizard() {
        super();
        setNeedsProgressMonitor(true);
    
    }
    
    @Override
    public IWizardPage getNextPage(IWizardPage page) {
        return super.getNextPage(page); 
    }   
    
    public void addPages() {    
        addPage(new ContactWizardPage());
        addPage(new ContactWizardPage());
        addPage(new ContactWizardPage());
        addPage(new ContactWizardPage());               
    }
    
    public boolean performFinish() {
        return true;
    }
    
    
    public void init(IWorkbench workbench, IStructuredSelection selection) {
    
    }
    

    }

    使用此代码向导的第一页显示正常,但第二页永远不会正确呈现。 :( 这是截图: 第一页:

    enter image description here

    第二页: enter image description here

2 个答案:

答案 0 :(得分:1)

该行

parent.getShell().setSize(240, 320);                    

令人沮丧(并且不是你应该在向导页面中做的事情,因为Wizard类处理大小调整)。在这里进行测试没有它就可以正常工作(我得到你的问题)。

答案 1 :(得分:0)

确保只要向导处于打开状态,就不会丢弃FormToolKit。在createControl()完成后,Paint事件需要工具包。

我的解决方案是在向导中创建和处理FormToolKit:

@Override
public void createPageControls(Composite pageContainer) {       
    toolkit = new FormToolkit(pageContainer.getDisplay());

    super.createPageControls(pageContainer);
}

@Override
public void dispose() {     
    super.dispose();

    if (toolkit != null) {
        try { toolkit.dispose(); } catch (Exception e) {}
    }
}

public FormToolkit getToolkit() {
    return toolkit;
}

在向导页面中,您可以使用((FormWizard)getWizard).getToolkit()来获取对向导表单工具包的引用。

@Override
public void createControl(Composite parent) {

    FormToolkit toolkit = ((FormWizard) getWizard()).getToolkit();

    ...

希望这会有所帮助......