2012-10-04 54 views
2

如何將驗證添加到SWT小部件?例如。 Text
我都嘗試以下(在網上找到):如何驗證輸入的SWT小部件(文本)

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

如果我添加一個字符,光標stucks,我甚至不能將其刪除。
即使我第一次刪除所有東西,光標也會被刪除,而我不能寫任何其他東西。
我在這裏搞什麼?我該怎麼做Text的驗證?
在這種情況下,我只想接受一個號碼作爲端口。

回答

10

您正在創建的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; 
     } 
    } 
}); 
+0

使用VerifyEvent你心裏有本作的正確代碼在線例如只輸入數字嗎? – Cratylus

+1

+1,但請抓住'NumberFormatException',不要在知道應該捕獲哪一個時使用'Exception'。 – Baz

+2

@MikeK:似乎有效,但需要修改如下:'catch(Exception ex){if(!port.equals(「」)){e.doit = false;}} – Cratylus

6

我想建議的JFace數據綁定。您可以輕鬆地將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); 
0

(簡單的)文本字段輸入或Java中RCP/SWT的Eclipse

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