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

文字を追加するとカーソルが動かなくなり、削除すらできなくなります。
初めて全部削除してもカーソルが動かなくなって何も書けません。
私はここで何を台無しにしていますか?の検証をどのように行う必要がありTextますか?
この場合、ポートとして機能する番号のみを受け入れたいと思います。

4

3 に答える 3

11

The VerifyListener you are creating will be called before any text has actually been entered. You a currently checking the text that has already been entered to see if the value is valid, but it will never be valid because no text has yet been entered.

Try reading the value of e.text to see if it's an integer and use the e.start and e.end properties along with the the getText() you have now to see if the overall new value will be between 0 and 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;  
        }  
    }  
});
于 2012-10-04T21:59:01.780 に答える
6

JFaceDataBindingを提案したいと思います。テキストフィールドにを簡単に追加し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 に答える