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]limitation caractères et setText()


Sujet :

AWT/Swing Java

  1. #1
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut [JTextField]limitation caractères et setText()
    Bonsoir

    J'ai récemment ajouter une limitation de caractères sur mes JTextField via un plainDocument. J'ai trouvé cette classe sur le forum :

    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
    public class TextLimiter extends PlainDocument {
        private int max;
     
        public TextLimiter(int max){
            super();
     
            this.max = max;
        }
     
        public void insertString(int offset, String str, AttributeSet attrs) throws BadLocationException {
            if (str != null && getLength() + str.length() > max) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                super.insertString(offset, str, attrs);
            }
        }
     
        public void replace(int offset, int length, String str, AttributeSet attrs)
                throws BadLocationException {
            if (str != null && getLength() + str.length() - length > max) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                super.replace(offset, length, str, attrs);
            }
        }
    }
    Ca marche parfaitement bien, sauf dans le cas où j'emploie setText pour dire le texte que je veut mettre dedans. Avec setText, ca n'écrit rien dans mon JTextField...

    Est-ce que mon code est faux, ou alors faut il redéfinire une autre méthode que celle-ci ?

    Merci d'avance

    Bonne soirée

  2. #2
    Membre éclairé
    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
    Points : 704
    Points
    704
    Par défaut
    je peut dire deux chose?

    1- n'utilise pas PlainDocument mais DocumentFilter
    2- evite le copier coller ;-)

    ensuite teste ca :-)

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.text.AbstractDocument;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.DocumentFilter;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 13-Jun-2006
     * Time: 21:08:56
     * To change this template use File | Settings | File Templates.
     */
    public class TextLimiter /* extends PlainDocument */ extends DocumentFilter {
        private int max;
     
        public TextLimiter(int max) {
    //        super();
            this.max = max;
        }
     
    //    public void insertString(int offset, String str, AttributeSet attrs) throws BadLocationException {
     
        public void insertString(DocumentFilter.FilterBypass fb, int offset, String str, AttributeSet attr) throws BadLocationException {
            /*
            if (str != null && getLength() + str.length() > max) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                super.insertString(offset, str, attrs);
            }
            */
            replace(fb, offset, 0, str, attr);
        }
     
        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String str, AttributeSet attrs) throws BadLocationException {
            int newLength = fb.getDocument().getLength() - length + str.length();
     
            if (newLength <= max) {
                fb.replace(offset, length, str, attrs);
            } else {
                Toolkit.getDefaultToolkit().beep();
            }
            /*
            if (str != null && getLength() + str.length() - length > max) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                super.replace(offset, length, str, attrs);
            }
            */
        }
     
     
        public static void main(String[] args) {
            JFrame myFrame = new JFrame("");
            myFrame.setLayout(new FlowLayout(FlowLayout.LEFT));
            myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
            final JTextField myTextField = new JTextField();
            myTextField.setPreferredSize(new Dimension(150, 20));
            AbstractDocument doc = (AbstractDocument) myTextField.getDocument();
            doc.setDocumentFilter(new TextLimiter(10));
     
            JButton myButton = new JButton("Action!");
            myButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    try {
                        myTextField.getDocument().insertString(0, "helooo", null);
                    } catch (BadLocationException e1) {
                        e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                    }
                }
            });
            myFrame.add(myButton);
            myFrame.add(myTextField);
            myFrame.pack();
            myFrame.setVisible(true);
        }
    }

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Merci ta technique marche, mais pourquoi vaut-il mieux employer DocumentFilter que PlainDocument ?

    De plus, je suis pas tout à fait d'accord avec toi sur le copier-coller, ca ne sert à rien de réinventer la roue, les ressources disponibles sur ce forum, sont justement là pour nous aider. Je vois pas pourquoi on pourrais pas s'en servir. Le copier-coller n'est mauvais que quand on ne comprend pas ce que l'on copie.

  4. #4
    Membre éclairé
    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
    Points : 704
    Points
    704
    Par défaut
    Brazil 1 - 0 Croatia :-))

    pourquoi je dit DocumentFilter io PlainDocument?pourquoi c'est mieux?
    parce que DocumentFilter a ete ajouter au JDK 1.4 specialement pour ca :-)
    suffit de lire la javadoc.

    ** DocumentFilter, as the name implies, is a filter for the Document mutation methods. When a Document containing a DocumentFilter is modified (either through insert or remove), it forwards the appropriate method invocation to the DocumentFilter. The default implementation allows the modification to occur. Subclasses can filter the modifications by conditionally invoking methods on the superclass, or invoking the necessary methods on the passed in FilterBypass. **

    pour le copy/paste je parlais de ca

    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
    public void insertString(int offset, String str, AttributeSet attrs) throws BadLocationException {
            if (str != null && getLength() + str.length() > max) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                super.insertString(offset, str, attrs);
            }
        }
     
        public void replace(int offset, int length, String str, AttributeSet attrs)
                throws BadLocationException {
            if (str != null && getLength() + str.length() - length > max) {
                Toolkit.getDefaultToolkit().beep();
            } else {
                super.replace(offset, length, str, attrs);
            }
        }

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

Discussions similaires

  1. [JTextField]Limiter le nombre de caractères admis
    Par thierrykammi dans le forum Composants
    Réponses: 4
    Dernier message: 13/10/2008, 18h04
  2. [JTextField] Limiter le nombre de caractères
    Par sky88 dans le forum Composants
    Réponses: 3
    Dernier message: 17/07/2008, 09h45
  3. [JTextField]limiter les caractères ?
    Par Baptiste Wicht dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 27/12/2005, 12h12
  4. [JTextField] Limiter le nombre de caractères
    Par Sweet2002 dans le forum Composants
    Réponses: 7
    Dernier message: 12/05/2005, 14h29
  5. [JTextField] Limiter le nombre de caractères
    Par thomas_strass dans le forum Composants
    Réponses: 2
    Dernier message: 08/09/2004, 14h06

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