OVH Cloud OVH Cloud

keyListener pour fermer une fenêtre avec ESC ou ENTER

3 réponses
Avatar
LR
Salut,

Je cherche un moyen d'écouter EFFICACEMENT lorsque l'utilisateur presse
escape ou entrée sur son clavier afin de pouvoir fermer mes dialog.

J'avais fait
this.addKeyListener(
new KeyListener()
{
public void keyPressed( KeyEvent e )
{
if ( e.getKeyCode() == KeyEvent.VK_ENTER )
close( true );
else if ( e.getKeyCode() ==
KeyEvent.VK_ESCAPE ) close( false );
}
public void keyReleased( KeyEvent e ) {}
public void keyTyped( KeyEvent e ) {}
}
);
sur une JDialog mais le résultat est décevant (ça fonctionne irrégulièrement
en fonction des VM etc.).

Comment faire pour que ça marche aussi bien que sur le JFileChooser( j'ai
pas trouvé comment ils gèrent ça dans le code) ?

Merci d'avance
Lilian

3 réponses

Avatar
François Cheippe
Je cherche un moyen d'écouter EFFICACEMENT lorsque l'utilisateur presse
escape ou entrée sur son clavier afin de pouvoir fermer mes dialog.



J'avais essayé, sans succès, car le keylistener doit être rattaché à un
objet graphique. Si tu le rattaches à la fenêtre (ce qui semble logique)
mais que le focus se trouve sur un bouton, un champ de saisie, etc. , alors
l'appui su ESC ne sera pas intercepté...

Si quelqu'un a une soultion élégante (éviter de déclarer un keylistener pour
chaque composant graphique de la fenêtre), je suis également preneur...

--
François

Avatar
grtdgh
LR wrote:
Salut,

Je cherche un moyen d'écouter EFFICACEMENT lorsque l'utilisateur presse
escape ou entrée sur son clavier afin de pouvoir fermer mes dialog.
...


Salut

Il faut utiliser les actions associées au clavier (cherche "Key
Bindings" dans le tutorial de sun).

Exemple, où comp est le panel principal de la fenêtre, et btValider et
btAnnuler deux boutons de la boite de dialogue :

Action valideAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
btValider.doClick();
}};
Action annuleAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
btAnnuler.doClick();
}};

InputMap im comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke("ESCAPE"), "annuleAction");
im.put(KeyStroke.getKeyStroke("ENTER"), "valideAction");

ActionMap am = comp.getActionMap();
am.put("annuleAction", annuleAction);
am.put("valideAction", valideAction);

a+
Jacques

Avatar
LR
"grtdgh" a écrit dans le message news:
bm0p3c$5vu$
LR wrote:
Salut,

Je cherche un moyen d'écouter EFFICACEMENT lorsque l'utilisateur presse
escape ou entrée sur son clavier afin de pouvoir fermer mes dialog.
...


Salut

Il faut utiliser les actions associées au clavier (cherche "Key
Bindings" dans le tutorial de sun).

Exemple, où comp est le panel principal de la fenêtre, et btValider et
btAnnuler deux boutons de la boite de dialogue :

Action valideAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
btValider.doClick();
}};
Action annuleAction = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
btAnnuler.doClick();
}};

InputMap im > comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke("ESCAPE"), "annuleAction");
im.put(KeyStroke.getKeyStroke("ENTER"), "valideAction");

ActionMap am = comp.getActionMap();
am.put("annuleAction", annuleAction);
am.put("valideAction", valideAction);


Ca marche a merveille, merci beaucoup !!
Lilian