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 avec zone de saisie limitée


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut JTextField avec zone de saisie limitée
    Bonjour,
    J'ai un soucis pour obtenir un JTextField dont la saisie ne dépasse pas une limite fixée.
    Il ne s'agit pas de limiter le nombre de caractères, mais plutot de limiter la taille de la chaine.

    "wwwwwwww" --> 8 caractères
    "lllllllllllllllllllllllllllll" --> 29 caractères

    J'ai utilisé un modèle de document avec vérification de la taille de la chaine, mais ça ne marche pas, quelqu'un a-t'il une idée ?

    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
     
    public class CustomText extends JTextField {
     
    	CustomText(int limitString) {
    		super();
    		Font f = new Font("Verdana", Font.PLAIN, 10);
    		this.setFont(f);
    		this.setDocument(new DocLimit(limitString, f));
    	}
     
    	class DocLimit extends PlainDocument {
     
    		private int limitStr;
    		private FontMetrics fm;
     
    		DocLimit(int limitS, Font f) {
    			super();
    			limitStr = limitS;
    			fm = getFontMetrics(f);
    		}
     
    		public void insertString(int offset, String str, AttributeSet attr)
    				throws BadLocationException {
    			if (str == null)
    				return;
    			if (fm.stringWidth(this.getText(0, getLength())) <= limitStr){
    					super.insertString(offset, str, attr);
     
    			} else
    				Toolkit.getDefaultToolkit().beep();
    		}
    	}

  2. #2
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Citation Envoyé par hexdoc
    Bonjour,
    J'ai un soucis pour obtenir un JTextField dont la saisie ne dépasse pas une limite fixée.
    Il ne s'agit pas de limiter le nombre de caractères, mais plutot de limiter la taille de la chaine.
    Pour moi limiter le nombre de caractere dans JTextField et limiter la taille de la chaine est la meme chose car la taille de la chaine represente le nombre de caracteres. Alors soit je comprend rien soit tu t'es mal exprimé.

    Mais regarde du coté des mask ca sera surement plus simple pour toi pour ce que tu veux en faire, si j'ai bien compris......

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    c'est pour ça que j'ai mis un exemple avec des l et des w, pour une même taille (longueur) le nombre de caractères est différent.

  4. #4
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Je crois que je viens seuleument de comprendre.

    Tu voudrais que ton JTextField accepte des caracteres jusqu'a ce que la longueur de 4,3 cm soit rempli (4,3 est un exemple)??

    Parce que si c'est ca t'es pas sorti, parce que tout dépend en plus de la police de l'ecran, de la taille de la police. Bref va falloir réfléchir et comme ca je ne vois pas du tout par quoi commencer et pire encore si c'est réalisable!!

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 238
    Points : 267
    Points
    267
    Par défaut
    Salut,

    je pense à une solution, je pense pas que ce soit la plus propre :
    Tu récupère dans ton textfield le texte et tu le passe à une objet FontMetrics (que tu obtient à partir d'un Graphics) et il y à une méthode : stringWidth (taChaine) qui permet de te donner la taille de la chaine en tenant compte de la Font (police, style, etc...).

    Voilà j'espère que ca pourra t'aider. a+

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    merci de vous y intéresser.
    j'ai essayé avec StringWidth (voir mon exemple de code), mais je ne comprends pas pourquoi, ça ne marche pas, les chaines visibles dans le JTextField sont de longueurs différentes selon les lettres employées, bien que la limite fixée soit la même.

  7. #7
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 80
    Points
    80
    Par défaut
    Directement sur le JTextField, ce n'est, à mon avis, pas possible.

    Par contre en passant par un graphics, sans probleme (quoique pas évident).

    J'ai eu à calculer la taille d'un String dans un graphics, et en passant par la classe FontMetrics et la méthode getStringBounds ça ne pose pas de probleme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    FontMetrics metric = g.getFontMetrics();
    double taille;
    taille = metric.getStringBounds(val, g).getWidth();
    //val : Le String dont tu veux obtenir la taille
    //g : le Graphics ou est affiché ta String
    Bien évidement, la taille obtenue depend de plein de critere.

    A savoir que JTextField extend JTextComponent, et que dans cette classe, tu pourra trouvé des méthode plus adapté.

    Bon courage

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Dans le JTextField dérivé, si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Graphics2D g = (Graphics2D) this.getGraphics;
    Font f = new Font("verdana", Font.PLAIN,10);
    FontMetrics fm = g.getFontMetrics(f);
    j'ai un 'java.lang.NullPointerException' sur mon FontMetrics.
    Dans JTextComponent , je n'ai pas vu de méthodes que je pourrais utiliser.

    J'ai fait une recherche sur google, et je n'ai pas retrouvé ce type de problème. Je sèche ...

  9. #9
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par hexdoc
    Dans le JTextField dérivé, si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Graphics2D g = (Graphics2D) this.getGraphics;
    Font f = new Font("verdana", Font.PLAIN,10);
    FontMetrics fm = g.getFontMetrics(f);
    j'ai un 'java.lang.NullPointerException' sur mon FontMetrics.
    Dans JTextComponent , je n'ai pas vu de méthodes que je pourrais utiliser.

    J'ai fait une recherche sur google, et je n'ai pas retrouvé ce type de problème. Je sèche ...
    il manque les parenthése derriere getGraphics; mais je pense que c'est une erreur de recopie dans le sujet.

    Sinon fais un test sur ton g (System.out.println("this.getGraphics() : "+g)
    Perso, aprés un test rapide, il me renvois null. Ton probleme est peut être la.

  10. #10
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Il serait peut-être possible de calculer la taille actuelle du texte dans paintComponent (comme ça tu as le bon objet Graphics). Ensuite, dans insertString tu vérifies que la taille ne soit pas trop grande.

    Avec quelques précautions (du style gestion des copier coller de texte trop long, etc) ça devrait tourner pas trop mal.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    oups, autant pour moi, en essayant le code que j'ai écrit dans le premier message sur un JTextField dans un JFrame nu, ça marche bien !!!

    Ma difficulté doit donc se situer dans l'environnement dans lequel j'ai placé mon JTextFiefd qui m'a posé problème. Merci à ceux qui se sont penchés sur ce problème.

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

Discussions similaires

  1. Idées pour une alternative à un MessageBox avec zone de saisie
    Par dada4444 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/06/2009, 11h54
  2. Conversion d'états en pdf avec zones de saisies
    Par tieuphuong dans le forum IHM
    Réponses: 5
    Dernier message: 03/07/2007, 12h02
  3. Boite de dialogue avec zone de saisie
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/06/2007, 17h09
  4. [FLASH MX2004] Zone de saisie avec scrollbar
    Par carlito dans le forum Flash
    Réponses: 3
    Dernier message: 29/11/2004, 14h30

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