IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

JTextField limité à certaines valeurs


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut JTextField limité à certaines valeurs
    Bonjour,

    j'essaie d'écrire un JTextField limité à des nombre de 1 à 40 et à partir de 40 permettant de rajouter .5 à la fin jusqu'à 50.

    par exemple jusqu'à 40 seulement les entiers :
    1, 2, 3
    et à partir de 40 avec une virgule restreinte à .5 :
    40, 40.5, 41, 41.5 etc jusqu'à 50

    j'ai écrit ce bout de code mais il ne fonctionne pas et je n'arrive pas à trouver.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class SpecialFloat extends PlainDocument {
       public void insertString(int offs, String str, AttributeSet att)
                throws BadLocationException {
          if (str == null) {
             return;
          }
          if (str.matches ("^[1-4]?[0-9]$|^4[0-9]\\.5?$|^50$")) {
             super.insertString (offs, str, att);
          }
       }
    }
    est-ce que quelqu'un aurait une idée?

    merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    A mon avis le problème estdans ton expression régulière. Je n'y connais pas grand chose mais je ne pense pas que tu puise spécifier deux fois le ^ et le $
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      if (str.matches ("^[1-4]?[0-9]$") || str.matches("^4[0-9]\\.5?$") || str.matches("^50$")) {
        super.insertString (offs, str, att);
      }
    Sinon une série de if et quelques methodes de String devrait te permettre d'avoir le même résultat

  3. #3
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 707
    Par défaut
    Je ne suis pas un expert en expression regulière mais il me semble qu'il y a plusieurs erreur ou risque d'erreur:
    1. Il me semble que le | ne porte pas sur l'ensemble de ^ à $ si tu ne met pas de parenthèses
    2. pour la vérification du ".5" le ? ne porte que sur le 5 pas le point

    Je pense que cette expression devrait fonctionner: "(50)|(4[0-9](\\.5)?)|([1-3]?[0-9])"

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    j'ai aussi testé mais à priori cette méthode ne vérifie que le dernier caractère ajouté et donc ça ne fonctionne pas.

    si il n'y pas d'autres solutions je ferais en sorte de tester avec les keyevent mais je ne trouve pas très propre donc je voulais savoir si il y avait une autre solution.

    Citation Envoyé par Uther Voir le message
    Je ne suis pas un expert en expression regulière mais il me semble qu'il y a plusieurs erreur ou risque d'erreur:
    1. Il me semble que le | ne porte pas sur l'ensemble de ^ à $ si tu ne met pas de parenthèses
    2. pour la vérification du ".5" le ? ne porte que sur le 5 pas le point

    Je pense que cette expression devrait fonctionner: "50|(4[0-9](\\.5)?)|([1-3]?[0-9])"
    oui désolé je viens de voir que j'avais mis la mauvaise expression effectivement la vrai c'est \\.?5? car l'utilisateur en attendant de taper le 5 peut avoir mis un point tout seul.
    j'ai testé en mettant 3 matches différents mais j'ai remarqué par la suite que ça ne vérifiais que les dernières données saisies donc ça fonctionne pour un copier/coller uniquement.

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 707
    Par défaut
    \\.?5? n'est pas une bonne solution non plus car 405,415,... deviennent des valeurs valides.
    D'ailleurs mon expression est également fausse elle devrait commencer par (50) et non 50

    Si tu ne t'en sort pas avec l'expression régulière tu tu dois pouvoir t'en sortir avec la méthode suivante:
    1. convertir le string en float
    2. multiplier par 10
    3. convertir en int
    4. si 0<resultat<=400 verifier que resultat%10==0
    5. si 400<resultat<=500 verifier que resultat%5==0

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    j'y avais aussi pensé mais ce n'est pas trop le problème de l'expression régulière mais plutot le problème de savoir si il y a une manière propre de le faire.

    en fait l'expression régulière je l'avais tapée vite fait juste pour tester sans vraiment y prêter trop attention mais comme le insertString() ne vérifie que sur la dernière entrée (la dernière touche pressée), il n'est pas possible de faire le check correctement avec ça.

    je n'ai rien trouvé de plus convainquant que de tester si c'était un entier ou un point avec le insertString() et de gèrer le test avec des keyevent et un stack pour revenir en arrière en cas de problème.

    mais comme je ne trouve pas ça propre du tout je cherche encore une meilleure solution.

    en sachant que ce code sera réutilisé pour plusieurs types de TextField avec différentes valeurs et différentes possibilités d'entrées dans mon code je ne voulais pas trop coder mal cette partie.

    en tout cas merci pour les réponses et si quelqu'un à une autre idée

Discussions similaires

  1. JTextField n'acceptant que certaines valeurs
    Par paul62 dans le forum Composants
    Réponses: 2
    Dernier message: 06/11/2007, 09h53
  2. Cacher certaines valeurs avec TDBEdit
    Par Vulcanos dans le forum Bases de données
    Réponses: 2
    Dernier message: 13/09/2005, 17h14
  3. [JTextField] Limiter le nombre de caractères
    Par Sweet2002 dans le forum Composants
    Réponses: 7
    Dernier message: 12/05/2005, 15h29
  4. select avec un nombre limité de valeurs retournées
    Par felix79 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 23/12/2004, 16h16
  5. [JTextField] Limiter le nombre de caractères
    Par thomas_strass dans le forum Composants
    Réponses: 2
    Dernier message: 08/09/2004, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo