如何避免在后退然后单击下一步时添加小部件? [英] How to avoid widgets being added while moving back and on then clicking Next?

查看:78
本文介绍了如何避免在后退然后单击下一步时添加小部件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个向导。



它有 3 页-

  @Override 
public void addPages(){
super.addPages();
addPage(firstPage);
addPage(secondPage);
addPage(thirdPage);
}

对于第一页,我有一个简单的标签带有输入字段以收集用户输入的值-

  @Override 
public void createControl(Composite parent){
Composite page = new Composite(parent,SWT.NONE);
setControl(page);
setPageComplete(false);

// page.setLayout(new GridLayout(2,false));
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.makeColumnsEqualWidth = false;
page.setLayout(gridLayout);

page.setLayoutData(new GridData(GridData.FILL_BOTH));

标签=新标签(页面,SWT.NONE);
label.setText(接口ID:);

interfaceId = new Text(page,SWT.BORDER);
GridData interfaceIdGridData =新的GridData(GridData.FILL_HORIZONTAL);
interfaceId.setLayoutData(interfaceIdGridData);



}



当用户单击上面向导页面上显示的下一步按钮时,将调用一个从内部系统收集一些详细信息的调用 getNextPage 进入同一向导页面。



然后用户进入向导页面 2 以及在 step1 中获取的详细信息在向导页面2中显示在这里

 公共类InterfaceDetailsPage扩展了WizardPage {

private复合顶部;
private ScrolledComposite scrolledComposite;
个私人复合页面;

私人标签responseCode;
私人标签回复消息;
私人标签interfaceName;
private Label sourceSystem;
私人标签targetSystem;
私人标签domainName;
私人标签serviceName;

private SelectedServerNode iServer;
private volatile boolean activityCancelled;
私人CreateSkeletonResponseModel模型;
private CreateSkeletonDisplayResultModel resultModel;

受保护的InterfaceDetailsPage(SelectedServerNode iServer){
super( InterfaceDetailsPage);

this.iServer = iServer;
setTitle( Component Details);
setMessage(请求的接口详细信息如下:);
}

@Override
public void createControl(Composite parent){

top = new Composite(parent,SWT.NONE);
top.setLayout(new FillLayout());
setControl(top);
setPageComplete(false);


scrolledComposite = new ScrolledComposite(top,SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
scrolledComposite.setExpandHorizo​​ntal(true);
scrolledComposite.setExpandVertical(true);

页面=新的Composite(scrolledComposite,SWT.NONE);
// setControl(page);


GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
//gridLayout.makeColumnsEqualWidth = true;
gridLayout.makeColumnsEqualWidth = false;
page.setLayout(gridLayout);
page.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));


scrolledComposite.setContent(page);
scrolledComposite.setSize(page.computeSize(SWT.DEFAULT,SWT.DEFAULT));;


GridData gridData = null;

//处理标签响应代码及其值
Label responseCodeLbl = new Label(page,SWT.NONE);
// gridData = new GridData(GridData.FILL_HORIZONTAL);
//responseCodeLbl.setLayoutData(gridData);
responseCodeLbl.setText( Response Code:);

responseCode =新标签(页面,SWT.NONE);
gridData =新的GridData(GridData.FILL_HORIZONTAL);
responseCode.setLayoutData(gridData);

//处理标签响应消息及其值
Label responseMsgLbl = new Label(page,SWT.NONE);
// gridData = new GridData(GridData.FILL_HORIZONTAL);
//responseMsgLbl.setLayoutData(gridData);
responseMsgLbl.setText( Response Message:);

responseMsg = new Label(page,SWT.NONE);
gridData =新的GridData(GridData.FILL_HORIZONTAL);
responseMsg.setLayoutData(gridData);



}

@Override
public void setVisible(布尔型可见){
if(可见){

InterfacePage interfacePage =(InterfacePage)(getWizard()。getPage( InterfacePage));;
ModelObject模型= interfacePage.getModelObject();

GridData gridData = null;

//处理标签接口名称及其值
Label interfaceNameLbl = new Label(page,SWT.NONE);
// gridData = new GridData(GridData.FILL_HORIZONTAL);
//interfaceNameLbl.setLayoutData(gridData);
interfaceNameLbl.setText(接口ID:);

interfaceName = new Label(page,SWT.NONE);
gridData =新的GridData(GridData.FILL_HORIZONTAL);
interfaceName.setLayoutData(gridData);

//处理标签源系统及其值
Label sourceSystemLbl = new Label(page,SWT.NONE);
// gridData = new GridData(GridData.FILL_HORIZONTAL);
//sourceSystemLbl.setLayoutData(gridData);
sourceSystemLbl.setText( Source System:);

sourceSystem =新标签(页面,SWT.NONE);
gridData =新的GridData(GridData.FILL_HORIZONTAL);
sourceSystem.setLayoutData(gridData);

//处理标签目标系统及其值
Label targetSystemLbl = new Label(page,SWT.NONE);
// gridData = new GridData(GridData.FILL_HORIZONTAL);
//targetSystemLbl.setLayoutData(gridData);
targetSystemLbl.setText( Target System:);

targetSystem =新标签(页面,SWT.NONE);
gridData =新的GridData(GridData.FILL_HORIZONTAL);
targetSystem.setLayoutData(gridData);

//处理标签域名及其值
Label domainNameLbl = new Label(page,SWT.NONE);
// gridData = new GridData(GridData.FILL_HORIZONTAL);
//domainNameLbl.setLayoutData(gridData);
domainNameLbl.setText(域名:);

domainName =新标签(页面,SWT.NONE);
gridData =新的GridData(GridData.FILL_HORIZONTAL);
domainName.setLayoutData(gridData);

//处理标签服务名称及其值
Label serviceNameLbl = new Label(page,SWT.NONE);
// gridData = new GridData(GridData.FILL_HORIZONTAL);
//serviceNameLbl.setLayoutData(gridData);
serviceNameLbl.setText( Service Name:);

serviceName = new Label(page,SWT.NONE);
gridData =新的GridData(GridData.FILL_HORIZONTAL);
serviceName.setLayoutData(gridData);




interfaceName.setText(null!= model.getInterfaceName()?model.getInterfaceName():);
// setTitle(model.getInterfaceID1()+ details);

sourceSystem.setText(null!= model.getSourceSystem()?model.getSourceSystem():);
targetSystem.setText(null!= model.getTargetSystem()?model.getTargetSystem():);
domainName.setText(null!= model.getDomainName()?model.getDomainName():);
serviceName.setText(null!= model.getServiceName()?model.getServiceName():);

responseCode.setText(String.valueOf(model.getResponseCode()));
responseMsg.setText(null!= model.getResponseMessage()?model.getResponseMessage():);

page.layout();
scrolledComposite.layout(true,true);
scrolledComposite.setMinSize(page.computeSize(SWT.DEFAULT,SWT.DEFAULT));;
top.layout();
setPageComplete(true);


}
super.setVisible(可见);
} ...



显示的最后5个标签是在 setVisible 方法内部生成的



如果现在我通过按返回按钮后退,然后单击下一步,我会看到新的标签被添加到前一行之下,因此显示两次。如何防止这种行为?



解决方案

setVisible 中创建控件是错误的。您只应使用页面的 createControl 方法创建控件。



setVisible 方法应仅在 createControls



如果某些控件未总是显示,则在createControls中创建它们,并调用 setVisible(false)到不显示它们。



如果刚刚显示了很多变量值,请使用Table或TableViewer并将其内容设置为setVisible。



最后,如果确实需要,您可以在 setVisible 中创建东西,但是您必须记住您已经完成了此操作,并且在第二次调用setVisible时不再这样做。 / p>

I have created a Wizard.

it has 3 pages-

@Override
public void addPages() {
    super.addPages();
    addPage(firstPage);
    addPage(secondPage);   
    addPage(thirdPage);   
}

For the first page, I have a simple label with a input field to collect user entered value-

    @Override
    public void createControl(Composite parent) {
        Composite page = new Composite(parent, SWT.NONE);
        setControl(page);
        setPageComplete(false);

        // page.setLayout(new GridLayout(2, false));
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        gridLayout.makeColumnsEqualWidth = false;
        page.setLayout(gridLayout);

        page.setLayoutData(new GridData(GridData.FILL_BOTH));

        Label label = new Label(page, SWT.NONE);
        label.setText("Interface Id : ");

        interfaceId = new Text(page, SWT.BORDER);
        GridData interfaceIdGridData = new GridData(GridData.FILL_HORIZONTAL);
        interfaceId.setLayoutData(interfaceIdGridData);



    }

When the user clicks on the Next button shown on the above wizard page, there is a call to collect some details from external system within getNextPage of the same wizard page.

The user then lands on wizard page 2 and the details which were fetched in step1 are displayed here in Wizard Page 2-

public class InterfaceDetailsPage extends WizardPage {

    private Composite top;
    private ScrolledComposite scrolledComposite;
    private Composite page;

    private Label responseCode;
    private Label responseMsg;
    private Label interfaceName;
    private Label sourceSystem;
    private Label targetSystem;
    private Label domainName;
    private Label serviceName;

    private SelectedServerNode iServer;
    private volatile boolean activityCancelled;
    private CreateSkeletonResponseModel model;
    private CreateSkeletonDisplayResultModel resultModel;

    protected InterfaceDetailsPage(SelectedServerNode iServer) {
        super("InterfaceDetailsPage");

        this.iServer = iServer;
        setTitle("Component Details");
        setMessage("The requested Interface details are shown below : ");
    }

    @Override
    public void createControl(Composite parent) {

        top = new Composite(parent, SWT.NONE);
        top.setLayout(new FillLayout());
        setControl(top);
        setPageComplete(false);


        scrolledComposite = new ScrolledComposite(top, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);

        page = new Composite(scrolledComposite, SWT.NONE);
        //setControl(page);


        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        //gridLayout.makeColumnsEqualWidth = true;
        gridLayout.makeColumnsEqualWidth = false;
        page.setLayout(gridLayout);
        page.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));


        scrolledComposite.setContent(page);
        scrolledComposite.setSize(page.computeSize(SWT.DEFAULT, SWT.DEFAULT));


        GridData gridData = null;

        // Deals with the label response code and its value
        Label responseCodeLbl = new Label(page, SWT.NONE);
        //gridData = new GridData(GridData.FILL_HORIZONTAL);
        //responseCodeLbl.setLayoutData(gridData);
        responseCodeLbl.setText("Response Code : ");

        responseCode = new Label(page, SWT.NONE);
        gridData = new GridData(GridData.FILL_HORIZONTAL);
        responseCode.setLayoutData(gridData);

        // Deals with the label response message and its value
        Label responseMsgLbl = new Label(page, SWT.NONE);
        //gridData = new GridData(GridData.FILL_HORIZONTAL);
        //responseMsgLbl.setLayoutData(gridData);
        responseMsgLbl.setText("Response Message : ");

        responseMsg = new Label(page, SWT.NONE);
        gridData = new GridData(GridData.FILL_HORIZONTAL);
        responseMsg.setLayoutData(gridData);



    }

    @Override
    public void setVisible(boolean visible) {
        if (visible) {

            InterfacePage interfacePage = (InterfacePage) (getWizard().getPage("InterfacePage"));
            ModelObject model = interfacePage.getModelObject();

            GridData gridData = null;

            // Deals with the label interface name and its value
            Label interfaceNameLbl = new Label(page, SWT.NONE);
            //gridData = new GridData(GridData.FILL_HORIZONTAL);
            //interfaceNameLbl.setLayoutData(gridData);
            interfaceNameLbl.setText("Interface Id : ");

            interfaceName = new Label(page, SWT.NONE);
            gridData = new GridData(GridData.FILL_HORIZONTAL);
            interfaceName.setLayoutData(gridData);

            // Deals with the label source system and its value
            Label sourceSystemLbl = new Label(page, SWT.NONE);
            //gridData = new GridData(GridData.FILL_HORIZONTAL);
            //sourceSystemLbl.setLayoutData(gridData);
            sourceSystemLbl.setText("Source System : ");

            sourceSystem = new Label(page, SWT.NONE);
            gridData = new GridData(GridData.FILL_HORIZONTAL);
            sourceSystem.setLayoutData(gridData);

            // Deals with the label target system and its value
            Label targetSystemLbl = new Label(page, SWT.NONE);
            //gridData = new GridData(GridData.FILL_HORIZONTAL);
            //targetSystemLbl.setLayoutData(gridData);
            targetSystemLbl.setText("Target System : ");

            targetSystem = new Label(page, SWT.NONE);
            gridData = new GridData(GridData.FILL_HORIZONTAL);
            targetSystem.setLayoutData(gridData);

            // Deals with the label domain name and its value
            Label domainNameLbl = new Label(page, SWT.NONE);
            //gridData = new GridData(GridData.FILL_HORIZONTAL);
            //domainNameLbl.setLayoutData(gridData);
            domainNameLbl.setText("Domain Name : ");

            domainName = new Label(page, SWT.NONE);
            gridData = new GridData(GridData.FILL_HORIZONTAL);
            domainName.setLayoutData(gridData);

            // Deals with the label service name and its value
            Label serviceNameLbl = new Label(page, SWT.NONE);
            //gridData = new GridData(GridData.FILL_HORIZONTAL);
            //serviceNameLbl.setLayoutData(gridData);
            serviceNameLbl.setText("Service Name : ");

            serviceName = new Label(page, SWT.NONE);
            gridData = new GridData(GridData.FILL_HORIZONTAL);
            serviceName.setLayoutData(gridData);    




            interfaceName.setText(null != model.getInterfaceName() ? model.getInterfaceName() : "");
            // setTitle(model.getInterfaceID1() +" details");

            sourceSystem.setText(null != model.getSourceSystem() ? model.getSourceSystem() : "");
            targetSystem.setText(null != model.getTargetSystem() ? model.getTargetSystem() : "");
            domainName.setText(null != model.getDomainName() ? model.getDomainName() : "");
            serviceName.setText(null != model.getServiceName() ? model.getServiceName() : "");

            responseCode.setText(String.valueOf(model.getResponseCode()));
            responseMsg.setText(null != model.getResponseMessage() ? model.getResponseMessage() : "");

            page.layout();
            scrolledComposite.layout(true, true);
            scrolledComposite.setMinSize(page.computeSize(SWT.DEFAULT, SWT.DEFAULT));
            top.layout();
            setPageComplete(true);


        }
        super.setVisible(visible);
    } ...

As seen the last 5 labels displayed were generated inside the setVisible method

If now I move back by pressing the Back button and then click Next, I see the new labels are added under the previous rows and thus displayed twice. How can I prevent this behavior?

解决方案

Creating controls in setVisible is wrong. You should only create controls in the page's createControl method.

The setVisible method should only set values in the controls created by createControls

If some controls are not always shown create them in createControls and call setVisible(false) to not display them.

If there are many variable values which are just displayed use a Table or TableViewer and set the contents in setVisible.

Finally if you really have to you can create things in setVisible but you will have to remember you have done this and not do it again on the second call to setVisible.

这篇关于如何避免在后退然后单击下一步时添加小部件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆