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

AWT/Swing Java Discussion :

JTextField qui n'accepte que des caractères


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut JTextField qui n'accepte que des caractères
    Bonjour tout le monde

    J'ai une fenêtre qui contient deux zones de texte et je veux limiter ces deux zones de telle façon qu'elle ne puissent contenir que des lettres alphabétiques, le fait que l’utilisateur tape des chiffres ou des caractères de ponctuation (par exemple) doit être ignoré. Autrement dit si ces deux zones de texte détiennent le curseur, seul le pavé alphabétique sera actif.



    Merci par avance.

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Tu peux utiliser un DocumentFilter à cet effet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    package regexp;
     
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.text.AbstractDocument;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
     
    public class Test {
        public Test() {
            initComponents();
        }
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Test();
                }
            });
        }
     
        private void initComponents() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JTextField jtf = new JTextField(); // add filter to document
            ((AbstractDocument) jtf.getDocument())
                    .setDocumentFilter(new MyDocumentFilter());
            frame.add(jtf);
            frame.pack();
            frame.setVisible(true);
        }
    }
     
    class MyDocumentFilter extends DocumentFilter {
        @Override
        public void replace(FilterBypass fb, int i, int i1, String string,
                AttributeSet as) throws BadLocationException {
            for (int n = string.length(); n > 0; n--) {
     
                char c = string.charAt(n - 1);// get a single character of the
                                                // string
                System.out.println(c);
                if (Character.isLetter(c)) {
                    // if its an alphabetic character
                    super.replace(fb, i, i1, String.valueOf(c), as); 
                } else {
                    // it was not an alphabetic character or white space
                    System.out.println("Not allowed");
                }
            }
        }
     
        @Override
        public void remove(FilterBypass fb, int i, int i1)
                throws BadLocationException {
            super.remove(fb, i, i1);
        }
     
        @Override
        public void insertString(FilterBypass fb, int i, String string,
                AttributeSet as) throws BadLocationException {
            super.insertString(fb, i, string, as);
        }
    }
    Celui ci se base sur la méthode isLetter de Character, mais tu pourrais améliorer ça en utilisant une expression régulière à la place
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut
    Merci beaucoup de m'avoir répondu si rapidement.
    Votre méthode marche bien.

    J'ai essayé avec JFormattedTextField et MaskFormatter comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zone = new JFormattedTextField(new MaskFormatter("ULLLLLL"));
    et ça marche aussi mais le problème c'est que je ne peux pas taper "L'espace" dans la zone du texte. Comment peut-on résoudre ce problème ?





    Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    En rajoutant un ou dans la condition testant sur le caractère ajouté.

    Character.isLetter(c) || c == ' '
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut
    Oui ça marche pour la première solution mais pour la solution de Mask ??

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Il ne te permettra pas de placer le caractère espace n'importe où.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 135
    Points : 67
    Points
    67
    Par défaut
    Ok je vous remercie de vos réponses.


    -->> Résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une zone de texte qui n'accepte que des nombres
    Par boutheinanabeul dans le forum VB.NET
    Réponses: 26
    Dernier message: 30/03/2015, 15h42
  2. un wxtextCtrl qui accepte que des chiffres
    Par boubou00 dans le forum wxWidgets
    Réponses: 9
    Dernier message: 27/06/2007, 10h11
  3. Réponses: 1
    Dernier message: 18/04/2007, 13h39
  4. JavaScript/Zone de texte : n'accepter que les caractères numériques
    Par arkienou dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 26/07/2006, 14h16
  5. un CEdit qui n'accepte que les décimaux
    Par Midou dans le forum MFC
    Réponses: 4
    Dernier message: 01/03/2006, 17h43

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