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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 averti
    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
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 averti
    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
    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 : 55
    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
    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 averti
    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
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 averti
    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
    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 ?

+ 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