首页 > 解决方案 > SWT-如何将数据从一个页面传输到另一个页面

问题描述

我有一个名为 PageOne 的 WizardPage 并带有一个文本框,我想打印在 PageOne 的 textBox 中输入的数据以显示在第二页中。

我尝试将值保存在另一个对象中并将该对象传递给 PageTwo 对象并尝试显示,我尝试发送 pageOne 对象本身。但在这两种情况下,它都会打印出 NULL。我相信它正在打印出默认值,即在加载页面时加载了 null。

我该如何处理这种情况?

代码:

第一页:

 public void createControl(Composite parent) {
        container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        container.setLayout(layout);
        layout.numColumns = 2;
        Label label1 = new Label(container, SWT.NONE);
        label1.setText("Put a value here.");

        text1 = new Text(container, SWT.BORDER | SWT.SINGLE);
        text1.setText("");
        text1.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (!text1.getText().isEmpty()) {
                    setPageComplete(true);
                }
            }
        });
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        text1.setLayoutData(gd);
        setControl(container);
        setPageComplete(true);
    }

第二页:

public class PageTwo extends WizardPage {
    private Text text1;
    private Composite container;
    private Text text2;
    PageOne pageOne;

    public PageTwo(PageOne pageOne) {
        super("PageTwo ");
        this.pageOne=pageOne;
        setTitle("PageTwo ");
        setDescription("Fake Wizard: PageTwo");
    }

    public void setText(Text text){
        this.text2=text;
    }

    @Override
    public void createControl(Composite parent) {
        container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        container.setLayout(layout);
        layout.numColumns = 2;
        Label label1 = new Label(container, SWT.NONE);
        String result="";

        if(pageOne.getText()!=null){
            result=pageOne.getText().toString();
        }

        label1.setText("Put a value here."+result);

       /* text1 = new Text(container, SWT.BORDER | SWT.SINGLE);
        text1.setText("");
        text1.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (!text1.getText().isEmpty()) {
                    setPageComplete(true);
                }
            }
        });
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        text1.setLayoutData(gd);*/
        setControl(container);
        setPageComplete(true);
    }

    public String getText1() {
        return text1.getText();
    }
}

更新

所做的更改:

在向导页面中:

public void addPages() {
    super.addPages(); 
    DataTransferObject dto = new DataTransferObject();
    addPage(new PageOne(dto));
    addPage(new PageTwo(dto));
    addPage(new PageThree());
}

数据传输对象

public class DataTransferObject {

    String data=null;

    public String getData(){
        return this.data;
    }

    public void setData(String data){
        this.data=data;
    }

}

第一页:

public class PageOne extends WizardPage {
    private Text text1;
    private Composite container;
    private DataTransferObject dto;

    public Text getText(){
        return this.text1;
    }

    public PageOne(DataTransferObject dto) {
        super("PageOne ");
        setTitle("PageOne ");
        this.dto=dto;
        setDescription("Fake Wizard: PageOne");
    }

    @Override
    public void createControl(Composite parent) {
        container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        container.setLayout(layout);
        layout.numColumns = 2;
        Label label1 = new Label(container, SWT.NONE);
        label1.setText("Put a value here.");

        text1 = new Text(container, SWT.BORDER | SWT.SINGLE);
        text1.setText("");
        text1.addKeyListener(new KeyListener() {

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (!text1.getText().isEmpty()) {
                    setPageComplete(true);
                }
            }
        });
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        text1.setLayoutData(gd);
        setControl(container);
        setPageComplete(true);
    }

    public String getText1() {
        return text1.getText();
    }

    @Override
    public IWizardPage getNextPage() {
        // TODO Auto-generated method stub
        System.out.println("Data is "+this.text1.getText().toString());
        dto.setData(this.text1.getText().toString());
        return super.getNextPage();
    }
}

第二页:

public class PageTwo extends WizardPage {
    private Text text1;
    private Composite container;
    private Text text2;
    PageOne pageOne;
    DataTransferObject dto; 

    public PageTwo(DataTransferObject dto) {
        super("PageTwo ");
        this.dto=dto;
        setTitle("PageTwo ");
        setDescription("Fake Wizard: PageTwo");
    }

    public void setText(Text text){
        this.text2=text;
    }

    @Override
    public void createControl(Composite parent) {
        container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        container.setLayout(layout);
        layout.numColumns = 2;
       // Label label1 = new Label(container, SWT.NONE);
        String result="";

        org.eclipse.swt.widgets.List single = new org.eclipse.swt.widgets.List(container, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
        if(!(dto.data==null)){
            single.add(dto.getData());
        }
        setControl(container);
        setPageComplete(true);
    }

    public String getText1() {
        return text1.getText();
    }
}

界面部分:

第一页 在此处输入图像描述

第二页

在此处输入图像描述

标签: eclipse-pluginswteclipse-rcpjface

解决方案


一种方法是在构建它们时将相同的对象传递给两个页面。

所以你Wizard可能会这样做:

@Override
public void addPages()
{
  DataTransferObject dto = new DataTransferObject();

  addPage(new PageOne(dto));

  addPage(new PageTwo(dto);
}

向导页面如下所示:

public class PageOne extends WizardPage {
    DataTransferObject dto;

    public PageOne(DataTransferObject dto) {
        super("PageOne");

        this.dto = dto;
    }
public class PageTwo extends WizardPage {
    DataTransferObject dto;

    public PageTwo(DataTransferObject dto) {
        super("PageTwo ");

        this.dto = dto;
    }

DataTransferObject是您编写的某个类,其中包含您要共享的数据。PageOne应该在对象中设置值,以便PageTwo可以检索它们。

PageTwo应该等待setVisible调用访问数据:

 @Override
 public void setVisible(final boolean visible)
 {
   if (visible)
    {
      // TODO access data and update the controls which show the data
    }
 }

super.setVisible(visible);

}

setVisible代码必须更新已经创建的控件。因此,对于Text您会调用的控件setText,依此类推。


推荐阅读