Java 如何避免在返回并单击“下一步”时添加小部件?

Java 如何避免在返回并单击“下一步”时添加小部件?,java,eclipse-plugin,swt,Java,Eclipse Plugin,Swt,我已经创建了一个向导 它有3页- 对于第一页,我有一个带有输入字段的简单标签,用于收集用户输入的值- @Override public void createControl(Composite parent) { Composite page = new Composite(parent, SWT.NONE); setControl(page); setPageComplete(false); // page.se

我已经创建了一个向导

它有3页-

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

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



    }
当用户单击上面向导页面上显示的“下一步”按钮时,会有一个从同一向导页面的getNextPage中的外部系统收集一些详细信息的调用

然后,用户登录到向导第2页,步骤1中获取的详细信息显示在向导第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);
    } ...

如图所示,显示的最后5个标签是在setVisible方法中生成的

如果现在通过按“上一步”按钮向后移动,然后单击“下一步”,我会看到新标签添加到前几行下,因此显示两次。如何防止这种行为

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

setVisible方法应仅在createControls创建的控件中设置值

如果某些控件不总是显示,请在createControls中创建它们,并调用setVisiblefalse以不显示它们

如果有许多刚刚显示的变量值,请使用表格或表格查看器并在setVisible中设置内容


最后,如果您确实需要,您可以在setVisible中创建内容,但您必须记住您已经这样做了,并且在第二次调用setVisible时不再这样做。

对于上面的具有静态标签集的示例,我理解。但是,如果我有一个要显示的动态值列表,因此我无法预先知道需要生成多少行,那么我如何才能在创建控件中添加相同的行?在答案中添加了更多选项
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);
    } ...