2

如何向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;  
      }  
   }  
});     

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

4

3 回答 3

11

您正在创建的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;  
        }  
    }  
});
于 2012-10-04T21:59:01.780 回答
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);
于 2012-10-16T09:44:06.950 回答
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);
        }
    });
于 2017-01-10T11:58:39.773 回答