【问题标题】:In SWT Wizard Page how to write a event only when Next button is clicked在 SWT 向导页面中如何仅在单击下一步按钮时编写事件
【发布时间】:2019-01-26 09:25:04
【问题描述】:

我正在尝试实现一个具有三个不同页面的导入向导, 如何确保只有在单击下一个按钮时才验证一段代码。

  1. 第一步是在导入向导中进行选择。
  2. 在第二步中,将键入服务器 URL 和建立连接所需的其他信息。
  3. 一旦输入详细信息并按下下一步按钮,就会发生一系列动作

    • 检查连接详细信息是否有效。
    • 如果连接有效,则导入项目详细信息。如果连接详细信息有误,则显示错误对话框。
    • 进入下一页并显示项目内容。

我一直在用

    public IWizardPage getNextPage(IWizardPage page) { 

进入下一页,但是在使用它时,我可以看到多次调用下一页。

实施验证,即禁用下一步按钮,直到用户输入所有必要的详细信息,然后禁用下一步按钮。当他们进入验证 getNextPage(IWizardPage page) 方法被调用时,它会不断抛出错误对话。

如何确保仅在单击按钮时才调用 nextPage。

代码片段:

检查验证的代码:如果是,则启用下一步按钮。

    textIFServiceURL.addKeyListener(new KeyListener() {

        @Override
        public void keyPressed(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
            keyReleasedImpl();                
        }           
    });

    textIFServiceURL.addModifyListener(new ModifyListener() {

        @Override
        public void modifyText(ModifyEvent arg0) {
             modifyTextImpl();
        }           
    });

    txtUserName.addKeyListener(new KeyListener() {

        @Override
        public void keyPressed(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
            keyReleasedImpl();  
        }
    });

    txtUserName.addModifyListener(new ModifyListener() {

        @Override
        public void modifyText(ModifyEvent arg0) {
            modifyTextImpl();
        }
    });


    txtPassword.addKeyListener(new KeyListener() {

        @Override
        public void keyPressed(KeyEvent e) {
        }

        @Override
        public void keyReleased(KeyEvent e) {
            keyReleasedImpl();  
        }
    });

    txtPassword.addModifyListener(new ModifyListener() {

        @Override
        public void modifyText(ModifyEvent arg0) {
            modifyTextImpl();
        }
    });


}




private void modifyTextImpl() {
    // TODO Auto-generated method stub
    if ((txtUserName.getText().isEmpty() || textIFServiceURL.getText().isEmpty() || txtPassword.getText().isEmpty())) {
        consumerImportWizardPage.setPageComplete(false);
    }
}

private void keyReleasedImpl() {
    // TODO Auto-generated method stub
    if (!(txtUserName.getText().isEmpty() || textIFServiceURL.getText().isEmpty() || txtPassword.getText().isEmpty())) {                    
        consumerImportWizardPage.setPageComplete(true);
    }
}

更新答案:

    <?xml version="1.0" encoding="UTF-8"?>
    <?eclipse version="3.4"?>
    <plugin>

       <extension
             point="org.eclipse.ui.importWizards">
          <category
                name="Sample File Import"
                id="com.myplugin.importWizards.sampleCategory">
          </category>
          <wizard
                name="Import File"
                icon="icons/sample.gif"
                category="com.myplugin.importWizards.sampleCategory"
                class="com.myplugin.importWizards.ImportWizard"
                id="com.myplugin.importWizards.ImportWizard">
             <description>
                Import a file from the local file system into the workspace.
             </description>
          </wizard>
       </extension>

    </plugin>

导入向导

    package com.myplugin.importWizards;

    public class ImportWizard extends Wizard implements IImportWizard {

        ConsumerImportWizardPage mainPage;
        PageThree three;

        public ImportWizard() {
            super();
            mainPage = new ConsumerImportWizardPage();
            three = new PageThree();
        }

        @Override
        public String getWindowTitle() {
            return "Import Integration Project";
        }

        @Override
        public void addPages() {
            addPage(mainPage);
            addPage(three);
        }


        @Override
        public IWizardPage getNextPage(IWizardPage page) {
            // TODO Auto-generated method stub
            System.out.println("WE are in get NextPage");
            return super.getNextPage(page);
        }

        @Override
        public void init(IWorkbench arg0, IStructuredSelection arg1) {
            // TODO Auto-generated method stub

        }

        @Override
        public boolean performFinish() {
            // TODO Auto-generated method stub
            return false;
        }


    }

ConsumerImportWizardPage

    package com.myplugin.importWizards;

    public class ConsumerImportWizardPage extends WizardPage  {

        private final static String  TITLE = "Import an existing Project";
        private ImportPropertiesView twsPropertiesView;

        public ConsumerImportWizardPage() {
            super(TITLE);
            setTitle(TITLE);

        }

        @Override
        public void createControl(Composite parent) {
            // TODO Auto-generated method stub

            Composite composite = new Composite(parent, SWT.NONE);
            GridLayout layout = new GridLayout(3, false);
            layout.horizontalSpacing = 5;
            layout.verticalSpacing = 15;
            composite.setLayout(layout);
            setControl(composite);
            setPropertiesView(composite);   
            setPageComplete(false);

        }

         private void setPropertiesView(Composite twsPropertiesGroup) {
                twsPropertiesView = new ImportPropertiesView(twsPropertiesGroup,this);        
            }

         @Override
        public void setPageComplete(boolean complete) {
            // TODO Auto-generated method stub
            super.setPageComplete(complete);
        }

         @Override
         public void setVisible(final boolean visible)
         {
           if (visible)
            {
             System.out.println("Cool we are in the ");
            }

           super.setVisible(visible);
         } 
    }

导入属性视图

    package com.myplugin.importWizards;



    public class ImportPropertiesView {

        private Link configureWorkspaceSettingsLink;
        private Button projectSpecificSettingsButton;
        private ServerDetailsImportView serverDetailsView;
        private ConsumerImportWizardPage consumerImportWizardPage;

        public ImportPropertiesView(Composite parent,ConsumerImportWizardPage consumerImportWizardPage) {
            this.consumerImportWizardPage=consumerImportWizardPage;
            parent.setLayout(new GridLayout(2, false));
            addServerDetailsView(parent);

        }

        private void addServerDetailsView(Composite parent) {
            serverDetailsView = new ServerDetailsImportView(parent,consumerImportWizardPage);
            GridData gridData = new GridData();
            gridData.horizontalAlignment = GridData.FILL;
            gridData.grabExcessHorizontalSpace = true;
            gridData.horizontalSpan = 2;
        }


        /**
         * get the landscape url.
         *
         * @return
         */
        public String getComponentServiceURL() {
            return serverDetailsView.getComponentServiceURL();
        }



        public String getPassword() {
            return serverDetailsView.getPassword();
        }



        public String getUserName() {
            return serverDetailsView.getUserName();
        }

        public boolean getPageCompleteStatus() {
            return serverDetailsView.getPageCompleteStatus();
        }




        /**
         * set the given landscape url to {@link ServerDetailsView}
         *
         * @param componentServiceURL
         */
        public void setComponentServiceURL(String componentServiceURL) {
            serverDetailsView.setComponentServiceURL(componentServiceURL);
        }


        public void setPassword(String password) {
            serverDetailsView.setPassword(password);
        }


        public void setUserName(String userName) {
            serverDetailsView.setUserName(userName);
        }
    }

ServerDetailsImportView

    package com.myplugin.importWizards;


    public class ServerDetailsImportView {
        private final Label lblUserName;
        private final Text txtUserName;
        private final Label lblPassword;
        private final Text txtPassword;
        private final Group userCredentials;
        private boolean pageCompleteStatus=false;
        /** connection choice group */

        /** web connection group */
        private final Group webConnection;
        /** landscape url text box */
        private final Text textIFServiceURL;
        /** landscape url label */
        private final Label labelIFServiceURL;
        private ConsumerImportWizardPage consumerImportWizardPage;


        public ServerDetailsImportView(Composite parent, ConsumerImportWizardPage consumerImportWizardPage) {
            // connection choice group creation
            this.consumerImportWizardPage=consumerImportWizardPage;
            GridData gridData = new GridData();
            gridData.horizontalAlignment = GridData.FILL;
            gridData.grabExcessHorizontalSpace = true;
            gridData.horizontalSpan = 2;

            // web connection group creation
            webConnection = new Group(parent, SWT.SHADOW_IN);
            webConnection.setText("Connection Details");
            webConnection.setLayout(new GridLayout(2, false));
            webConnection.setLayoutData(gridData);

            gridData = new GridData();
            gridData.horizontalAlignment = GridData.FILL;
            gridData.grabExcessHorizontalSpace = true;

            labelIFServiceURL = new Label(webConnection, SWT.RIGHT);
            labelIFServiceURL.setText("Server IP : ");

            textIFServiceURL = new Text(webConnection, SWT.SINGLE | SWT.BORDER);
            textIFServiceURL.setLayoutData(gridData);

            gridData = new GridData();
            gridData.horizontalAlignment = GridData.FILL;
            gridData.grabExcessHorizontalSpace = true;
            gridData.horizontalSpan = 2;

            userCredentials = new Group(parent, SWT.SHADOW_IN);
            userCredentials.setText("User Credentials");
            userCredentials.setLayout(new GridLayout(2, false));
            userCredentials.setLayoutData(gridData);

            gridData = new GridData();
            gridData.horizontalAlignment = GridData.FILL;
            gridData.grabExcessHorizontalSpace = true;

            lblUserName = new Label(userCredentials, SWT.LEFT);
            lblUserName.setText("User Name:");

            txtUserName = new Text(userCredentials, SWT.SINGLE | SWT.BORDER);
            txtUserName.setLayoutData(gridData);

            lblPassword = new Label(userCredentials, SWT.LEFT);
            lblPassword.setText("Password:");

            txtPassword = new Text(userCredentials, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD);
            txtPassword.setEchoChar('*');
            txtPassword.setLayoutData(gridData);       


            textIFServiceURL.addKeyListener(new KeyListener() {

                @Override
                public void keyPressed(KeyEvent e) {
                }

                @Override
                public void keyReleased(KeyEvent e) {
                    keyReleasedImpl();                
                }           
            });

            textIFServiceURL.addModifyListener(new ModifyListener() {

                @Override
                public void modifyText(ModifyEvent arg0) {
                     modifyTextImpl();
                }           
            });

            txtUserName.addKeyListener(new KeyListener() {

                @Override
                public void keyPressed(KeyEvent e) {
                }

                @Override
                public void keyReleased(KeyEvent e) {
                    keyReleasedImpl();  
                }
            });

            txtUserName.addModifyListener(new ModifyListener() {

                @Override
                public void modifyText(ModifyEvent arg0) {
                    modifyTextImpl();
                }
            });


            txtPassword.addKeyListener(new KeyListener() {

                @Override
                public void keyPressed(KeyEvent e) {
                }

                @Override
                public void keyReleased(KeyEvent e) {
                    keyReleasedImpl();  
                }
            });

            txtPassword.addModifyListener(new ModifyListener() {

                @Override
                public void modifyText(ModifyEvent arg0) {
                    modifyTextImpl();
                }
            });


        }




        private void modifyTextImpl() {
            // TODO Auto-generated method stub
            if ((txtUserName.getText().isEmpty() || textIFServiceURL.getText().isEmpty() || txtPassword.getText().isEmpty())) {
                consumerImportWizardPage.setPageComplete(false);
            }
        }

        private void keyReleasedImpl() {
            // TODO Auto-generated method stub
            if (!(txtUserName.getText().isEmpty() || textIFServiceURL.getText().isEmpty() || txtPassword.getText().isEmpty())) {                    
                consumerImportWizardPage.setPageComplete(true);
            }
        }


        /**
         * get the entered value from {@link #textIFServiceURL}
         *
         * @return
         */
        public String getComponentServiceURL() {
            return textIFServiceURL.getText();
        }

        public String getPassword() {
            return txtPassword.getText();
        }

        public boolean getPageCompleteStatus() {
            return this.pageCompleteStatus;
        }


        public String getUserName() {
            return txtUserName.getText();
        }



        /**
         * set the given value to the text box {@link #textIFServiceURL}
         *
         * @param componentServiceURL
         */
        public void setComponentServiceURL(String componentServiceURL) {
            textIFServiceURL.setText(componentServiceURL);
        }



        public void setPassword(String password) {
            txtPassword.setText(password);
        }


        public void setUserName(String userName) {
            txtUserName.setText(userName);
        }


    }

【问题讨论】:

  • @greg-449,我的目的是在用户输入连接详细信息时检查连接是否有效,然后单击下一步。我假设编写一段代码的合适位置是 getNextPage()。但是我在这个实现中面临的问题如下:最初 Next 按钮是禁用的,只有在输入所有详细信息后才会启用,让我们假设输入了 url 输入了用户名,现在输入了密码输入非常击键时调用 getNextPage 方法,因为我正在调用 setPageComplete 方法来启用 Next Button。
  • @greg-449。所以想写只有按下Next按钮时才连接服务器的逻辑。

标签: eclipse eclipse-plugin swt jface


【解决方案1】:

通常getNextPage 应该只返回下一页,因为在调用setPageComplete 时,向导updateButtons 方法可能会多次调用它。

您可以通过覆盖向导页面canFlipToNextPage 方法来停止多次调用:

@Override
public boolean canFlipToNextPage()
{
  // Default calls getNextPage(), just checking page complete is enough here
  return isPageComplete();
}

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 2016-07-12
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多