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 :
- maFrame.setVisible(true);
|
tu peux essayer de rajouter :
Code :
- 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 :
- this.getRootPane().registerKeyboardAction(
- this,
- KeyStroke.getKeyStroke(KeyEvent.VK_F1,0),
- JComponent.WHEN_IN_FOCUSED_WINDOW);
|
La version moderne pourrait être :
Code :
- maFrame.getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F1" ), "action F1" );
- maFrame.getRootPane().getActionMap().put("action F1", new AbstractAction() {
- public void actionPerformed(ActionEvent ae) {
- System.out.println("touche F1 pressée" );
- }
- }
- );
|
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