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 :

keyPressed dans JTextField


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut keyPressed dans JTextField
    Bonjour,

    Je suis en train de réaliser un petit logiciel et je bloque sur deux-trois trucs.

    J'ai une interface toute simple avec 3 JTextField et 2 JButton

    Mon principal problème est que lorsque le focus est sur un JTextField, un keyPressed sur le contentPane ne fonctionne pas, y'a-t-il un moyen de régler ceci sans avoir à ajouter un keyPressed dans chaque JTextField ?

    Mon second problème est que j'aimerais faire en sorte que lorsque la touche pressée est "entrée", cela simule un clique sur un button ou du moins le ramène à l'évènement que j'ai associé à celui-ci, j'ai testé btnValider.doClick(), je vois le clique se faire sur l'interface mais il ne se passe rien.

    Merci par avance pour votre aide !

    Code de mon bouton valider :

    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
    		btnValider = new JButton("Valider");
    		btnValider.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent arg0) {
    				if(txtNom.getText().replace(" ","").equals(""))
    				{
    					afficherMessage("La saisie est obligatoire");
    					txtNom.requestFocus();
    					return;
    				}
    				if(txtPrenom.getText().replace(" ","").equals(""))
    				{
    					afficherMessage("La saisie est obligatoire");
    					txtPrenom.requestFocus();
    					return;
    				}
    				if(txtTel.getText().replace(" ", "").length() != 4)
    				{
    					try 
    					{
    						String numTel = txtTel.getText().replace(" ", "").replace("-", "");
    						Integer.parseInt(numTel);
    						String nom = txtNom.getText();
    						String prenom = txtPrenom.getText();
    						c = new Client(nom,prenom,numTel);
    						System.out.println(c.getNom() + c.getPrenom() + c.getTel());
    						cDAO.create(c);
    						afficherMessage("Client ajouté avec succès");
    						dispose();
     
    					}
    					catch(Exception e){e.printStackTrace();}
    				}
    			}
    		});
    		getContentPane().add(btnValider);
    		btnValider.setBounds(10,218,100,20);
    Code de mon bouton annuler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    btnAnnuler = new JButton("Annuler");
    		getContentPane().add(btnAnnuler);
    		btnAnnuler.setBounds(124,218,100,20);
    		btnAnnuler.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent arg0) {
    				dispose();
    			}
    		});
    keyPressed sur le contentPane :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		getContentPane().addKeyListener(new KeyAdapter() {
    			@Override
    			public void keyPressed(KeyEvent e) {
    				touchePressee(e);
    			}
    		});
    Methode que je souhaite faire fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private void touchePressee(KeyEvent e)
    	{
    		if(e.getKeyCode() == KeyEvent.VK_ENTER)
    		{
    		//Code du btnValider
    		}
    		if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
    		{
    		dispose();
    		}
    	}

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Bonjour, petit up car je ne sais pas si j'ai été suffisamment explicite sur mon premier poste.

    Alors dans la petite fenêtre que j'ai créé j'ai 3 JTextField et 2 JButton (valider, annuler).
    J'aimerais que lorsque je suis dans un JTextField et que j'appuie sur entrée, le code du btnValider s'éxecute et que lorsque j'appuie sur echape, un simple dispose();

    J'ai trouvé cette solution mais je ne pense pas qu'elle soit optimisée :

    -Créer une méthode "touchePressée" exécutant btnValider si la touche pressée est ENTREE ou dispose(); si la touche pressée est ECHAPE.

    -Ajouter un event KEYPRESSED dans chacun de mes JTextField appelant la methode "touchePressée"


    Mes JTextField :
    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
    txtNom = new JTextField();
    		txtNom.addKeyListener(new KeyAdapter() {
    			@Override
    			public void keyPressed(KeyEvent e) {
    				touchePressee(e);
    			}
    		});
    		getContentPane().add(txtNom);
    		txtNom.setBounds(100,45,100,20);
    		txtNom.setHorizontalAlignment(txtNom.CENTER);
     
    		txtPrenom = new JTextField();
    		txtPrenom.addKeyListener(new KeyAdapter() {
    			@Override
    			public void keyPressed(KeyEvent e) {
    				touchePressee(e);
    			}
    		});
    		getContentPane().add(txtPrenom);
    		txtPrenom.setBounds(100,85,100,20);
    		txtPrenom.setHorizontalAlignment(txtPrenom.CENTER);
     
    		//Création du format pour le JFormattedTextField txtTel
    		try {
    			// # = int
    			maskTel = new MaskFormatter("##-##-##-##-##");
    			} 
    		catch (ParseException e) {e.printStackTrace();}
    		//Affiche un espace à la place de '#' dans le txtTel
    		maskTel.setPlaceholderCharacter(' ');
     
    		txtTel = new JFormattedTextField(maskTel);
    		txtTel.addKeyListener(new KeyAdapter() {
    			@Override
    			public void keyPressed(KeyEvent e) {
    				touchePressee(e);
    			}
    		});
    		getContentPane().add(txtTel);
    		txtTel.setBounds(100,125,100,20);
    		txtTel.setHorizontalAlignment(txtTel.CENTER);
    Ma methode touchePressée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private void touchePressee(KeyEvent e)
    	{
    		if(e.getKeyCode() == KeyEvent.VK_ENTER)
    		{
    		btnValider.doClick();
    		}
    		if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
    		{
    		dispose();
    		}
    	}
    (le .doClick() fonctionne finalement)

    Ma question est donc, auriez-vous une solution plus adaptée, optimisée que la mienne qui me permettrait de ne pas répéter 3x l'appel à ma méthode ? Merci par avance pour votre aide.

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Visiblement, tu utilise le keypressed pour réagir seulement à certaines touches. Dans ce cas, je te suggère de t'orienter vers les raccourcis claviers globaux à la fenetre plutot que de jouer avec le keypressed, qui n'arrive que sur le composant ayant le focus.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    KeyStroke accelerator = KeyStroke.getKeyStroke("pressed enter"); // Le raccourcis clavier à utiliser
    Action action = .....; // une instance de Action pour gérer l'évènement
    panneau.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(accelerator,"cléAToiArbitraire");
    panneau.getActionMap().put("cléAToiArbitraire",action);

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Bonjour et merci pour ta réponse.

    J'me sens un peu perdu pour le coup ! x)

    Le KeyStroke c'est pour stocker un raccourci clavier ok.

    Pour l'action je ne sais pas vraiment quoi instancier.

    Je vois panneau.getInputMap() et .getActionMap(), ça correspond à getContentPane.getInputMap() ? Si c'est le cas je n'ai pas les methodes.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ce sont des méthodes que tu trouveras dans la classe javax.swing.JPanel (Ce sont des méthodes de la classe javax.swing.JComponent). Généralement, on ne définit pas directement l'interface graphique dans le contentPane, mais on fait un JPanel qu'on met dans le contentPane (Dans l'exemple de @Tchize_, panneau est une variable de type JComponent, probablement un JPanel).

    Si le contentPane est un JComponent (comme c'est la cas du JLayeredPane), tu pourrais caster, mais le contentPane est un java.awt.Container de manière générale : il vaut mieux donc pour être sûr de ne pas avoir de problème un jour, faire un JPanel intermédiaire.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    D'accord ! Merci pour avoir éclairci ma lanterne.

    Je vais donc ajouter un JPanel à tous mes formulaires si c'est conseillé !

    Il ne me manque plus qu'à comprendre l'histoire de l'action et je pense que ce sera bon.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Jesus_Cry Voir le message
    Pour l'action je ne sais pas vraiment quoi instancier.
    L'action, c'est comme un ActionListener, mais avec plein de décoration autour pour pouvoir l'activer /désactiver, lui donner un nom, un tooltip, une icone, etc et à partir de ça fabiquer facilement des MenuItem, des JButon, des toolbars, ....


    Dans ton cas, instancie simplement un AbstractAction dont tu surcharge le actionListener:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    panneau = new JPanel();
    KeyStroke accelerator = KeyStroke.getKeyStroke("pressed enter"); // Le raccourcis clavier à utiliser
    Action action = new AbstractAction(){
        public void actionPerformed(ActionEvent e){
            // que faire en cas de touche "enter"?
        }
    }; 
    panneau.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(accelerator,"cléAToiArbitraire");
    panneau.getActionMap().put("cléAToiArbitraire",action);
    //remplir le panneau, lui mettre un layout, etc
    frame.setContentPane(panneau);

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Bah dîtes-donc vous êtes rapides !

    Ah d'accord, je crois avoir compris.

    Du coup l'action ne se déclenchera que si la touche pressée est entrée ?
    Je n'ai donc pas besoin de faire ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Action action = new AbstractAction(){
        public void actionPerformed(ActionEvent e){
           if(e.getKeyCode() == KeyEvent.VK_ENTER)
             {
              // mon code
             }
        }
    };
    Et dernier point, si jamais je veux bind une deuxième touche, il faut que je répète l'opération une deuxième fois ?

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    T'as tout compris

    Maintenant, tu peux tout regroupe dans une action pour ensuite splitter suivant les keycode, mais bon... J'ai tendance à préférer séparer l'opération (valider le textfield, par exemple) de la manière dont elle est déclenchée (clic sur bouton, appui sur entrée, ....)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Comment ça valider le textField ?

    Du coup je vais essayer de bind entrée pour simuler un click sur le btnValider et echape pour dispose(); et je vous dis ça dans l'aprem.

    Merci du coup de main !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Bonjour et excusez-moi pour le retard, j'étais pas mal occupé ailleurs.

    Quand j'appuie sur entrée, je vois donc un click se faire sur le btnValider de mon interface MAIS... il ne se passe rien alors qu'il possède un évènement mouseClicked.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		contentPane = new JPanel();
    		KeyStroke enter = KeyStroke.getKeyStroke("pressed ENTER");
    		Action enterPressed = new AbstractAction(){
    		    public void actionPerformed(ActionEvent e){
    		        btnValider.doClick();
    		    }
    		}; 
    		contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(enter,1);
    		contentPane.getActionMap().put(1,enterPressed);
    Pour le coup, si jamais je veux faire un dispose() sur ma fenêtre quand ÉCHAPPE est appuyé, je dois répeter ce bloc de code une deuxième fois pour cette touche ?

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    doClick ne génère pas de mouseEvent, il génère un actionEvent. D'ailleurs, tu ne devrais pas utiliser un mouseListener pour déterminer ce que fait ton JButton, c'est le rôle de l'ActionListener.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Nickel, j'ai remplacé par un actionPerformed et ça marche !

    Maintenant j'aimerais, s'il te plaît, savoir comment faire si je veux faire le même procédé pour la touche ÉCHAPPE, je fais simplement la même chose ou y'a-t-il un moyen d'optimiser (admettons par exemple qu'il y ait 15 touches à bind) ?

    Désolé si je pose trop de questions mais j'en apprends beaucoup et rapidement ici, du coup j'en profite :p

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Petit up du sujet pour deux autres questions concernant le key binding.

    Tout fonctionne sauf le bind de la touche entrée lorsque je suis dans une JComboBox...

    De plus, j'aimerais pouvoir appliquer le bind d'entrée et échappe à chacun de mes formulaires sans avoir à tout réécrire, est-ce possible ?

    Le code du binding :

    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
    	private void KeyBinding()
    	{
    		KeyStroke enter = KeyStroke.getKeyStroke("pressed ENTER");
    		Action enterPressed = new AbstractAction(){
    		    public void actionPerformed(ActionEvent e){
    		        btnValider.doClick();
    		    }
    		}; 
    		contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(enter,1);
    		contentPane.getActionMap().put(1,enterPressed);
     
    		KeyStroke escape = KeyStroke.getKeyStroke("pressed ESCAPE");
    		Action escapePressed = new AbstractAction(){
    		    public void actionPerformed(ActionEvent e){
    		       dispose();
    		    }
    		}; 
    		contentPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escape,2);
    		contentPane.getActionMap().put(2,escapePressed);
    	}

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

Discussions similaires

  1. l'évènement "keypress" dans une textbox
    Par dams580 dans le forum Delphi .NET
    Réponses: 1
    Dernier message: 15/05/2006, 14h02
  2. afficher int dans jtextfield
    Par bmw13fr dans le forum Langage
    Réponses: 4
    Dernier message: 24/02/2006, 08h26
  3. [VB.NET] keyPress dans un datagrid
    Par nkonito dans le forum Windows Forms
    Réponses: 11
    Dernier message: 31/12/2005, 21h29
  4. Du texte dans JTextField à partir d'un JFileChooser
    Par Eye4eye dans le forum Composants
    Réponses: 2
    Dernier message: 19/12/2005, 20h14
  5. [vb.net] evenement Keypress dans un Textbox
    Par arnolem dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/10/2005, 17h15

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