Problème avec addKeyListener

Problème avec addKeyListener - Java - Programmation

Marsh Posté le 03-05-2005 à 09:25:48    

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 =-
Reply

Marsh Posté le 03-05-2005 à 09:25:48   

Reply

Marsh Posté le 03-05-2005 à 09:44:17    


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

Reply

Marsh Posté le 03-05-2005 à 09:52:24    

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 =-
Reply

Marsh Posté le 03-05-2005 à 10:13:08    

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
Reply

Marsh Posté le 03-05-2005 à 10:17:03    

Ok je vais essayer ca.
 
Merci de ton aide


---------------
-= RAK =-
Reply

Marsh Posté le 03-05-2005 à 18:39:48    

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 ?
Reply

Marsh Posté le 03-05-2005 à 20:05:03    

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


---------------
-= RAK =-
Reply

Marsh Posté le 15-05-2008 à 11:00:18    

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

Reply

Marsh Posté le 15-05-2008 à 14:54:04    

trés utiles 3 ans apres  

Reply

Marsh Posté le 24-09-2008 à 14:30:25    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed