如何验证SWT窗口小部件的输入(文本)

时间:2012-10-04 21:39:11

标签: java eclipse swt eclipse-rcp jface

如何为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的验证呢? 在这种情况下,我只想接受一个作为端口的号码。

3 个答案:

答案 0 :(得分:11)

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

尝试阅读e.text的值以查看它是否为整数并使用e.starte.end属性以及您现在拥有的getText()来查看是否总体新值将介于0到65535之间。

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

你可以尝试类似的东西:

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 :(得分:6)

我想建议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);

答案 2 :(得分:0)

  

(简单)使用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);
        }
    });