【问题标题】:How to do validation of input of a SWT widget (Text)如何验证 SWT 小部件的输入(文本)
【发布时间】:2012-10-04 21:39:11
【问题描述】:

如何向SWT 小部件添加验证?例如。 Text?
我尝试了以下两种方法(在网上找到):

txtPort.addListener(SWT.Verify,new Listener() {  
  @Override  
  public void handleEvent(Event event) {  
      String port = ((Text)event.widget).getText();  
      try{  
          int portNum = Integer.valueOf(port);  
          if(portNum <0 || portNum > 65535){  
                event.doit = false;  
         }  
      }  
      catch(Exception ex){  
         event.doit = false;  
      }                 
   }  
});  

还有:

txtPort.addVerifyListener(new VerifyListener() {  
   @Override  
   public void verifyText(VerifyEvent e) {  
     String port = ((Text)e.widget).getText();  
      try{  
         int portNum = Integer.valueOf(port);  
         if(portNum <0 || portNum > 65535){  
             e.doit = false;  
          }  
      }  
      catch(Exception ex){  
          e.doit = false;  
      }  
   }  
});     

如果我添加一个字符,光标会卡住,我什至无法删除它。
即使我第一次删除所有内容,光标也会卡住,我不能写其他任何内容。
我在这里搞砸了什么?我应该如何验证Text
在这种情况下,我只想接受一个数字作为端口。

【问题讨论】:

    标签: java eclipse swt eclipse-rcp jface


    【解决方案1】:

    您正在创建的VerifyListener 将在实际输入任何文本之前被调用。您当前正在检查已输入的文本以查看该值是否有效,但它永远不会有效,因为尚未输入任何文本。

    尝试读取e.text 的值以查看它是否为整数,并使用e.starte.end 属性以及getText() 您现在必须查看整体新值是否介于0 和65535.

    更简单的解决方案可能是创建一个ModifyListener,它仅在 Text 小部件的文本包含有效端口号时启用提交按钮。

    您可以尝试类似的方法:

    txtPort.addVerifyListener(new VerifyListener() {  
        @Override  
        public void verifyText(VerifyEvent e) {
            /* Notice how we combine the old and new below */
            String currentText = ((Text)e.widget).getText();
            String port =  currentText.substring(0, e.start) + e.text + currentText.substring(e.end);
            try{  
                int portNum = Integer.valueOf(port);  
                if(portNum <0 || portNum > 65535){  
                    e.doit = false;  
                }  
            }  
            catch(NumberFormatException ex){  
                if(!port.equals(""))
                    e.doit = false;  
            }  
        }  
    });
    

    【讨论】:

    • 您是否想到了正确代码的在线示例?
    • +1,但是请抓住NumberFormatException,当你知道要抓住哪个时不要使用Exception
    • @MikeK:好像可以,但需要修改如下:catch(Exception ex){ if(!port.equals("")) {e.doit = false;}}
    【解决方案2】:

    我想推荐 JFace DataBinding。您可以轻松地将ControlDecorationSupport 添加到您的文本字段中,并为用户提供一些关于出了什么问题的提示。

    /* with portText being your SWT text control */
    IObservableValue textObservable = WidgetProperties.text().observe(portText);
    
    UpdateValueStrategy strategy = new UpdateValueStrategy();
    strategy.setBeforeSetValidator(new IValidator() {
    
        @Override
        public IStatus validate(Object value) {
            Integer portNumber = null;
            try {
                portNumber = Integer.valueOf((String) value);
            } catch (NumberFormatException e) {
                return error(e.getMessage() + " is not a number");
            }
            if (portNumber < 0 || portNumber > 65535) {
                return error("Number is out of range");
            }
            return ok();
        }
    });
    
    /* with text being the port value in your model */
    Binding binding = new DataBindingContext().bindValue(
            textObservable,
            PojoProperties.value(Model.class, "text").observe(this.model), 
            strategy, null);
    
    ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT);
    

    【讨论】:

      【解决方案3】:

      (简单)在 java rcp/swt Eclipse 中使用 VerifyEvent 输入文本字段或仅输入数字

          Text txt_mobile = new Text(grpBasicDetails, SWT.BORDER);
          txt_mobile.addVerifyListener(new VerifyListener() {
              public void verifyText(VerifyEvent e) {
      
                  /////  Keycode : backspace==8 (Enable backspace)
      
                  if(!(e.character>='0'&&e.character<='9'||e.keyCode==8))
                      {
                          txt_mobile.setText("");
                          //OR
                          //e.doit=false;
      
                      }
                      btnCancel.setEnabled(true);
              }
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 2011-10-08
        • 2010-10-29
        相关资源
        最近更新 更多