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

Java Discussion :

Contrôle de champs


Sujet :

Java

  1. #1
    Invité
    Invité(e)
    Par défaut Contrôle de champs
    Bonjour,

    Je travaille sous Eclipse et cherche à effectuer un contrôle de mes champs JTextField. J'ai essayé de voir avec une classe qui implémente "KeyListener" ou bien une autre qui implémente "DocumentListener", mais je n'ai pas encore réussi à trouver.

    Je voudrai en fait pouvoir interdire la saisie de lettres et caractères spéciaux autres que des chiffres pour un champ "Code postal", ou inversement que des lettres pour un champ "Nom".

    Harry Potter

  2. #2
    Invité
    Invité(e)
    Par défaut
    Regarde du côté des JFormattedTextField.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci, j'ai jeté un oeil, mais ça a l'air très technique et pas très clair comme explication. Je vais essayer de voir ça plus en profondeur. ^^

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Harry_Potter Voir le message
    mais ça a l'air très technique et pas très clair comme explication.
    C'est à ma connaissance la manière la plus propre de faire. Pour résumer, il te suffit de créer un pattern et de le passer au champ.

    Ce n'est pas plus techniuqe ou moins clair que de jouer avec un listener. Si vraiment tu veux jouer avec les listeners utilise plutôt un DocumentListener
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     new JTextField().getDocument().addDocumentListener(..)

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai exécuté leur application, mais le problème c'est que ça ne fait pas tout à fait ce que je veux. Les caractères invalides ne sont enlevés que sur sortie du champ, et s'il y avait des caractères valides lors de cette modification, ils sont aussi enlevés avec les invalides. Bref, pas terrible.

    J'ai aussi essayé avec "DocumentListener" mais pas trop compris exactement ce que ça fait. Il faudrait voir dans la méthode "changedUpdate" je pense.

    Sinon, j'ai aussi essayé avec "keyListener", mais ça rentre dans la méthode "keyTyped" avant que le nouveau caractère ne soit saisi.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    Pour filtrer des caractères lors de l'insertion, tu peux utiliser ta propre implémentation de Document (partie "Model" de MVC) que tu associes à ton composant swing (dans ton cas un JTextField, partie "View" de MVC).

    Regarde du côté de http://java.sun.com/j2se/1.4.2/docs/...nDocument.html et redéfinit la méthode insertString en filtrant les caractères non désirés et en invocant la méthode de la classe mère avec la nouvelle string.

    Tu peux aussi associer un "filtre" à un modèle existant : http://java.sun.com/j2se/1.4.2/docs/...terBypass.html

    Rq : avec un listener, tu peux aussi y arriver, mais c'est plus compliqué car tu ne profites pas de l'architecture MVC proposée par swing...

  7. #7
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Points : 188
    Points
    188
    Par défaut
    Au lieu de réinventer la roue utilise l'API JGoodies:

    http://www.jgoodies.com/download/dem...ationdemo.jnlp

    c'est une démo qui te permet de voir un peu ce que tu peux réaliser avec la partie validation

  8. #8
    Invité
    Invité(e)
    Par défaut
    C'est bon j'ai réussi avec keyListener, et la méthode keyPressed.

    Je mets ce sujet en résolu.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    par curiosité, est ce que ta solution fonctionne si tu fais un copier/coller dans le text field ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Heu j'ai pas compris ta question ?

    Un copié-collé de quoi ????

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ah ok je viens de comprendre...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Je viens de tester.

    Même avec un copié-collé, les caractères invalides s'enlèvent comme je veux, puisque sur keyPressed d'une touche, je vais contrôler chaque caractère du champ et reformer le champ avec les caractères valides.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Points : 40
    Points
    40
    Par défaut
    Et sous linux, en collant avec le bouton de la souris, ça marche aussi ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Je ne sais pas j'ai pas Linux.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Pourrais tu mettre ton code s'il te plaît Harry, je rencontre le même petit soucis que toi à l'heure actuelle.

    Merci

  16. #16
    Invité
    Invité(e)
    Par défaut
    Bien sûr, attends je vais rechercher mon code...

  17. #17
    Invité
    Invité(e)
    Par défaut
    Dans un premier temps, voici ma classe qui permet d'opérer toutes les rectifications (attention, par contre, je ne sais pas si tu arriveras à tout comprendre, parce que donner tout comme ça d'un bloc ^^) :

    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
    89
    90
    91
    92
    93
    94
    95
    96
    import java.awt.event.KeyListener;
    import java.awt.event.KeyEvent;
    import javax.swing.JTextField;
     
    public class caracEvt implements KeyListener{
    	//Attributs
    	private fenAccueil parent;
    	private int posFocus;//Pour récupérer la position du focus
    	private String monChamp;
    	private int tailleChamp;
    	private char[] tabCarac;//Tableau qui stockera les caractères valides du champ
    	private char leCarac;//Pour récupérer un caractère dans la chaîne
     
    	//Constructeur
    	public caracEvt(fenAccueil fenSommaire){
    		parent = fenSommaire;
    	}
     
    	//Méthodes
    	/*
    	 * Création de méthode privée à cet objet pour formater les champs (taille max, majuscules, ...)
    	 */
    	private void formatNom(JTextField unChamp){
    		int i, iTab;
    		boolean nllePos;//Pour savoir si un repositionnement du focus a défà été effectué (cas carac. invalide)
     
    		//Récupérer les infos du champ
    		posFocus = unChamp.getCaretPosition();
    		posFocus = posFocus>50?50:posFocus;
    		monChamp = unChamp.getText();
    		tailleChamp = unChamp.getText().length();
    		//Instanciation du tableau des caractères valides
    		tabCarac = new char[tailleChamp];
    		//Initialisation du compteur indice du tableau
    		iTab = 0;
    		//Initialisation de la nouvelle position du focus
    		nllePos = false;
     
    		//Parcourir l'ensemble des caractères du champ
    		for (i=0;i<tailleChamp;i++){
    			//Récupérer le caractère
    			leCarac = (char)(monChamp.substring(i, i+1).hashCode());
    			//Vérifier que le caractère est un caractère valide
    			if (leCarac>='A' && leCarac<='Z' || leCarac>='a' && leCarac<='z' || leCarac=='-'){
    				//Sauvegarder les caractères valides
    				tabCarac[iTab] = leCarac;
    				//Incrémenter l'indice du tableau
    				iTab++;
    			}
    			else if (nllePos==false){//Le caractère est invalide
    				//Mémoriser le nouvel endroit de positionnement du focus
    				posFocus = iTab;
    				nllePos = true;
    			}
    		}
    		//Ré-initialiser la valeur du champ
    		monChamp = "";
    		//Parcourir l'ensemble des caractères valides
    		for (i=0;i<iTab;i++){
    			//Recomposer le champ avec les caractères valides
    			monChamp += tabCarac[i];
    		}
    		//Limiter la chaîne à un certain nombre de caractères
    		monChamp = monChamp.length()>50?monChamp.substring(0, 50):monChamp;
    		//Remplacer la valeur actuelle du champ de saisie par les caractères valides
    		unChamp.setText(monChamp);
    	}
     
     
    	public void keyTyped(KeyEvent e) {
     
    	}
    	public void keyPressed(KeyEvent e){
    		/*
    		 * Cette méhode enregistre le caractère dans "e" lorsqu'une touche est enfoncée
    		 * (si elle reste enfoncée, elle est enregistrée plusieurs fois)
    		 */
    	}
     
    	public void keyReleased(KeyEvent e) {
    		/*
    		 * Cette méthode enregistre le caractère dans "e" lorsqu'une touche est relachée
    		 */
     
    		//Champ NOM
    		if (e.getSource()==parent.getTxtNomMbre()){
    			//Formater le champ nom
    			formatNom(parent.getTxtNomMbre());
    			//Mettre le champ en majuscules
    			parent.getTxtNomMbre().setText(parent.getTxtNomMbre().getText().toUpperCase());
    			//Repositionner le curseur au bon endroit
    			parent.getTxtNomMbre().setCaretPosition(posFocus);
    		}
     
    	}
    }

    Ensuite, dans ma classe fenAccueil :

    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
    public class fenAccueil extends JFrame{
    	private JTextField txtNomMbre;
    	private caracEvt saisCarEvt;
     
    	//Constructeur
    	public fenAccueil(){
    		//Appliquer l'interactivité sur caractère saisi sur la fenêtre
    		saisCarEvt = new caracEvt(this);
     
    		txtNomMbre = new JTextField(15);
    		txtNomMbre.addKeyListener(saisCarEvt);
    		this.add(txtNomMbre);
     
    		//Affichage du cadre de la fenêtre
    		this.setSize(700, 600);
    		this.setLocationRelativeTo(null);//Centrer sur l'écran
    		this.setTitle("Ton titre");
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
     
    	public JTextField getTxtNomMbre(){
    		return txtNomMbre;
    	}
    }
    Voilà, j'espère que ça va quand même pouvoir t'aider, j'ai essayé de simplifier au maximum. Normalement, là tu as tout ce qu'il faut pour faire marcher cette partie. Mais ce n'est pas LA solution, c'est une solution (ma solution même). Et loin d'être la meilleure sûrement.

    Harry Potter

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

Discussions similaires

  1. contrôles des champs saisis dans un formulaire
    Par barouz dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 06/12/2013, 13h55
  2. Probleme de contrôle de champs
    Par cutpeter56 dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2007, 17h03
  3. [Tableaux] contrôle de champs get sans effet
    Par ceostar dans le forum Langage
    Réponses: 11
    Dernier message: 02/03/2007, 11h27
  4. contrôle de champ vide
    Par allowen dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/03/2005, 14h16
  5. Problème de contrôle de champ input texte
    Par NATHW dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/10/2004, 22h48

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