2 votes

Comment faire la validation de l'entrée d'un widget SWT (Texte)

Comment ajouter la validation à un SWT widget ? Par exemple Text ?
J'ai essayé les deux solutions suivantes (trouvées en ligne) :

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

Aussi :

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

Si j'ajoute un personnage, le curseur se bloque et je ne peux même pas le supprimer.
Même si j'efface tout du premier coup, le curseur se bloque également et je ne peux plus rien écrire.
Qu'est-ce que je fais ici ? Comment suis-je censé faire la validation d'une Text ?
Dans ce cas, je veux seulement accepter un nombre servant de port.

11voto

Mike K Points 148

En VerifyListener que vous créez sera appelée avant qu'un quelconque texte n'ait été saisi. Vous vérifiez actuellement le texte qui a déjà été saisi pour voir si la valeur est valide, mais elle ne le sera jamais car aucun texte n'a encore été saisi.

Essayez de lire la valeur de e.text pour voir s'il s'agit d'un nombre entier et utiliser la fonction e.start y e.end ainsi que les propriétés de l getText() vous devez maintenant voir si la nouvelle valeur globale sera comprise entre 0 et 65535.

Une solution plus simple peut consister à créer un ModifyListener qui active un bouton d'envoi uniquement lorsque le texte du widget Texte contient un numéro de port valide.

Vous pouvez essayer quelque chose de similaire à ceci :

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

6voto

user121853 Points 11

Je veux suggérer JFace DataBinding. Vous pouvez facilement ajouter un ControlDecorationSupport à votre champ de texte et donner à l'utilisateur une indication sur ce qui ne va pas.

/* 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);

-1voto

Chetan Bhagat Points 355

(Simplement) Entrée dans un champ de texte ou saisie d'un seul chiffre en utilisant VerifyEvent en 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);
        }
    });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X