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 :

Comment limiter un JTextField à 25 lettres capitales ?


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut Comment limiter un JTextField à 25 lettres capitales ?
    Bonjour,

    je souhaite limiter un champ de saisies à 25 lettres en capitale, avec le premier caractère obligatoire.
    J'ai essayé d'utiliser un JFormattedTextField avec un MaskFormatter("UUUUUUUUUUUUUUUUUUUUUUUUU") mais si j'écris moins de 25 lettres, soit il m'efface la donnée saisie, soit si je décide de modifier le comportement par défaut et de commiter, il me complète avec des blancs...

    Sinon, j'ai trouvé le code suivant pour limiter un JTextField à un certain nombre de caractères : «
    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
     
    class JTextField2 extends JTextField {
    private int maxLength;
     
    JTextField2(String text, int columns) {
    super(text, columns);
    maxLength = columns;
    if (maxLength <= 0) maxLength = -1;
    addFocusListener(this);
    }
     
    protected Document createDefaultModel() {
    return new PlainDocument2();
    }
     
    class PlainDocument2 extends PlainDocument {
    public void insertString(int offset, String str, AttributeSet attr)
    throws BadLocationException {
    if (str == null) return;
    if (maxLength == -1 || getLength() + str.length() <= maxLength) {
    super.insertString(offset, str, attr);
    }
    }
    }
    }
    », mais je ne peux pas m'assurer que l'utilisateur ne saisit que des lettres en capitale.

    Comprenez-vous mon problème ?
    Comment puis-je faire ?
    Avez-vous une idée ?

    Merci beaucoup,
    F.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 193
    Par défaut
    Pourquoi ne pas faire un simple test dans une methode : testValidationChamps, qui throws une exception que tu auras pris le soin de créer.

    Tu parcours donc tous les champs de ta fenêtre, et pour celui spécifié ci dessus, un simple test sur le string dans le champ...Si pas correct: throw new MonException

    Ca me semble assez propre.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 82
    Par défaut
    ou tu peux ajouter dans la méthode insertText :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void insertString(int offset, String str, AttributeSet attr)
    throws BadLocationException {
    if (str == null) return;
    if(!str.equals(str.toUpperCase())) return;
    if (maxLength == -1 || getLength() + str.length() <= maxLength) {
    super.insertString(offset, str, attr);
    }
    }

  4. #4
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    une idee: utiliser un DocumentFilter?

    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
    68
     
    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
    import javax.swing.text.PlainDocument;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 22-mars-2007
     */
    public class MyDocumentFilter extends DocumentFilter {
     
        int maxLength = 0;
     
        public MyDocumentFilter(int maxLength) {
    //        super();    //To change body of overridden methods use File | Settings | File Templates.
            this.maxLength = maxLength;
        }
     
        public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
            super.remove(fb, offset, length);    //To change body of overridden methods use File | Settings | File Templates.
        }
     
        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
            replace(fb, offset, 0, string, attr);    //To change body of overridden methods use File | Settings | File Templates.
        }
     
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
    //        super.replace(fb, offset, length, text, attrs);    //To change body of overridden methods use File | Settings | File Templates.
            int newLength = fb.getDocument().getLength() - length + text.length();
            if (newLength <= maxLength) {
                fb.replace(offset, length, text.toUpperCase(), attrs);
            } else {
                throw new BadLocationException("New characters exceeds max size of document", offset);
            }
        }
     
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
     
                public void run() {
                    JFrame myFrame = new JFrame("Limit textComponents with DocumentFilter is better than PlainDocument");
     
                    JTextField myTextField = new JTextField();
                    PlainDocument p = (PlainDocument) myTextField.getDocument();
                    p.setDocumentFilter(new MyDocumentFilter(25));
     
                    myFrame.setLayout(new GridBagLayout());
                    GridBagConstraints gbc = new GridBagConstraints();
                    gbc.weightx = 1.0;
                    gbc.insets.left = gbc.insets.right = 5;
                    gbc.fill = GridBagConstraints.HORIZONTAL;
                    myFrame.add(myTextField, gbc);
     
                    myFrame.setSize(400, 300);
                    myFrame.setLocationRelativeTo(null);
                    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    myFrame.setVisible(true);
                }
            });
        }
    }

  5. #5
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Citation Envoyé par bbclone
    une idee: utiliser un DocumentFilter?

    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
    68
     
    import java.awt.EventQueue;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
    import javax.swing.text.PlainDocument;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 22-mars-2007
     */
    public class MyDocumentFilter extends DocumentFilter {
     
        int maxLength = 0;
     
        public MyDocumentFilter(int maxLength) {
    //        super();    //To change body of overridden methods use File | Settings | File Templates.
            this.maxLength = maxLength;
        }
     
        public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
            super.remove(fb, offset, length);    //To change body of overridden methods use File | Settings | File Templates.
        }
     
        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
            replace(fb, offset, 0, string, attr);    //To change body of overridden methods use File | Settings | File Templates.
        }
     
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
    //        super.replace(fb, offset, length, text, attrs);    //To change body of overridden methods use File | Settings | File Templates.
            int newLength = fb.getDocument().getLength() - length + text.length();
            if (newLength <= maxLength) {
                fb.replace(offset, length, text.toUpperCase(), attrs);
            } else {
                throw new BadLocationException("New characters exceeds max size of document", offset);
            }
        }
     
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
     
                public void run() {
                    JFrame myFrame = new JFrame("Limit textComponents with DocumentFilter is better than PlainDocument");
     
                    JTextField myTextField = new JTextField();
                    PlainDocument p = (PlainDocument) myTextField.getDocument();
                    p.setDocumentFilter(new MyDocumentFilter(25));
     
                    myFrame.setLayout(new GridBagLayout());
                    GridBagConstraints gbc = new GridBagConstraints();
                    gbc.weightx = 1.0;
                    gbc.insets.left = gbc.insets.right = 5;
                    gbc.fill = GridBagConstraints.HORIZONTAL;
                    myFrame.add(myTextField, gbc);
     
                    myFrame.setSize(400, 300);
                    myFrame.setLocationRelativeTo(null);
                    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    myFrame.setVisible(true);
                }
            });
        }
    }
    Attention avec le DocumentFilter, tu ne fais rien dans ton insert ! En cas de copier-collé dans le textField, c'est cette méthode qui est appelée et non le replace.
    J'ai été confronté à un put... de bug à cause de cet oubli...

  6. #6
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    tu peut me dire comment je teste ce ke tu dis?
    je comprend pas ton bug.

    l'insert fait betement un replace. je vois pas le probleme

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/01/2007, 16h53
  2. Réponses: 5
    Dernier message: 17/12/2004, 09h25
  3. [C#] Comment limiter l'accès à certaines personnes ?
    Par moimoimoi dans le forum Services Web
    Réponses: 1
    Dernier message: 26/05/2004, 10h14
  4. Comment compter le nombre de lettre identique ?
    Par divableue dans le forum ASP
    Réponses: 3
    Dernier message: 07/11/2003, 15h01
  5. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09

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