Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2440 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Problème avec addKeyListener

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec addKeyListener

n°1069926
Rak111
Posté le 03-05-2005 à 09:25:48  profilanswer
 

Bonjour,
 
J'ai écris une classe qui étend JFrame et j'essai de lui ajouter un keyListener. Pour cela j'ai simplement ajouté un "this.addKeyListener(new MyKeyListener())" dans le constructeur, j'ai ensuite écris la classe MyKeyListener qui implémente KeyListener en redéfinissant les 3 méthodes (KeyTyped(), KeyPressed(), KeyReleased()).
 
Mon problème est qu'apparament l'écoute des touches se fait mal et je ne recois aucun KeyEvent. Si par contre je remplace ma classe par une simple JFrame tout marche bien.
 
Ce problème a déjà été posé dans un topic mais aucune solution n'a été donnée si ce n'est de basculer sur une JFrame.
 
Quelqu'un aurait une autre idée ?


---------------
-= RAK =-
mood
Publicité
Posté le 03-05-2005 à 09:25:48  profilanswer
 

n°1069953
Nicolas_75
Posté le 03-05-2005 à 09:44:17  profilanswer
 


Bonjour,
 
Ta classe (étendant JFrame) doit perdre le focus en raison des composants qu'elle contient ? Que contient-elle : un JTabbedPane, des boutons, ... ?  
 
Si c'est cela, j'aurais peut-être une piste.
 
Sinon, poste un peu de code.
 
Cordialement,
 
Nicolas

n°1069969
Rak111
Posté le 03-05-2005 à 09:52:24  profilanswer
 

En effet la classe contient de nombreux composants (Buttons, JSplitPane, JTable, JPanel etc...).
 
(Je pourrai pas poster de code avant ce soir car je n'y ai pas accés de là ou je suis)


---------------
-= RAK =-
n°1070000
Nicolas_75
Posté le 03-05-2005 à 10:13:08  profilanswer
 

Selon moi, le rajout de certains composants dans la JFrame fait perdre le focus à cette dernière.  
 
1. Pour s'en assurer, après l'ajout des composants de la JFrame, et juste après l'équivalent de :

Code :
  1. maFrame.setVisible(true);


tu peux essayer de rajouter :  

Code :
  1. maFrame.requestFocusInWindow();


Normalement, le KeyListener devrait alors fonctionner, jusqu'à ce que tu cliques qqpart dans la JFrame, et que cette dernière perde le focus.  
 
2. Solution possible, sur laquelle je suis tombé il y a qqes temps, à partir de ce forum anglophone :
http://www.codecomments.com/archiv [...] 57161.html
Extrait :
"Defintely, adding a global KeyListener won't work on 1.4 if you add  
something like a JTextField or JButton to the container. I can swear  
it did work on 1.3"
 
Ils proposent une solution utilisant une méthode maintenant "deprecated" :  

Code :
  1. this.getRootPane().registerKeyboardAction(
  2.     this,
  3.     KeyStroke.getKeyStroke(KeyEvent.VK_F1,0),
  4.     JComponent.WHEN_IN_FOCUSED_WINDOW);


La version moderne pourrait être :  

Code :
  1. maFrame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F1" ), "action F1" );
  2. maFrame.getRootPane().getActionMap().put("action F1", new AbstractAction() {
  3.     public void actionPerformed(ActionEvent ae) {
  4.         System.out.println("touche F1 pressée" );
  5.     }
  6. }
  7. );


 
Avec ce code, l'appui de F1 à n'importe quel moment, même après avoir cliqué un peu partout, fait réagir l'application.  
 
Cf. tutoriel :  
http://java.sun.com/docs/books/tut [...] nding.html
 
Mais, peut-être existe-t-il une meilleure solution, et surtout plus simple ?
 
En espérant que cela puisse un peu aider...
 
Nicolas


Message édité par Nicolas_75 le 03-05-2005 à 12:15:45
n°1070009
Rak111
Posté le 03-05-2005 à 10:17:03  profilanswer
 

Ok je vais essayer ca.
 
Merci de ton aide


---------------
-= RAK =-
n°1070822
the real m​oins moins
Posté le 03-05-2005 à 18:39:48  profilanswer
 

http://bugs.sun.com/bugdatabase/vi [...] id=4464723
http://bugs.sun.com/bugdatabase/vi [...] id=4478706
 
J'ai le même probleme et je vais essayer le solution proposée par "mushina".
 
(mon appli marchait en 1.3 et marche plus en 1.4 ou 5)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1070921
Rak111
Posté le 03-05-2005 à 20:05:03  profilanswer
 

Je viens d'essayer la solution de Nicolas et ca marche très bien.


---------------
-= RAK =-
n°1732120
trabzy
Posté le 15-05-2008 à 11:00:18  profilanswer
 

Ca marche ou presque...
Au lieu de WHEN_ANCESTOR_OF_FOCUSED_COMPONENT il faut utiliser WHEN_IN_FOCUSED_WINDOW au cas ou vous auriez appuyé sur d'autre touches, ce qui ne permettrait pas l'éxécution des actions.
Voici un code generique pour ajouter des actions à votre fenetre (Jframe, Jdialog, JInternalFrame).
 
public class MyFrame extends JFrame {
 
....
 
      public void addAction(Action action, KeyStroke keyStroke) {
  JRootPane rootPane = this.getRootPane();
  rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, keyStroke.toString() );
  rootPane.getActionMap().put(keyStroke.toString(), action);
 }
 
.....
 
}//end class MyFrame

n°1732225
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 15-05-2008 à 14:54:04  profilanswer
 

trés utiles 3 ans apres  

n°1791394
trabzy
Posté le 24-09-2008 à 14:30:25  profilanswer
 

infoman64 a écrit :

trés utiles 3 ans apres  


 
Pas forcément réfléchit avant de poster ...
mon argument (pas envie decrire pour toi)
http://www.commentcamarche.net/for [...] xa-en-java


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Problème avec addKeyListener

 

Sujets relatifs
Probleme de requette[HTML /JAVASCRIPT je crois] probleme formulaire
Problème d'UlpoadProbleme client en perl
Probleme de JOIN (je pense)Problème de connexion Access
Probleme de lecture d'arborescence[WiP PHP/CSS] 3 Mars: Problème de marge CSS
petit probleme de JScrollPane[CSS] 'overflow' et firefox 1.0.3 = problème
Plus de sujets relatifs à : Problème avec addKeyListener


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR