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

Agents de placement/Fenêtres Java Discussion :

KeyListener sur JDialog


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut KeyListener sur JDialog
    Bonjour,

    Ma question est toute bête : est-ce qu'on peut ajouter un KeyListener à un JDialog?
    J'ai créé une JDialog qui implémente KeyListener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MaDialog implements KeyListener
    et dans son constructeur je fais :
    J'implémente les méthodes requises comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	public void keyPressed(KeyEvent arg0) {
    	}
     
    	public void keyReleased(KeyEvent arg0) {
    		if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE)
    			bCancel.doClick();
    		if (arg0.getKeyCode() == KeyEvent.VK_ENTER)
    			bOK.doClick();
    	}
     
    	public void keyTyped(KeyEvent arg0) {
    	}
    Mais malheureusement, je ne rentre jamais dans ces méthodes...
    Qu'est ce que je fais de mal?

    PS : j'ai l'impression d'être un gros boulet...

  2. #2
    Membre chevronné Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441

  3. #3
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par let_me_in
    J'ai fait une recherche sur le forum avant de poster, et je suis tombé sur ce topic.
    Malheureusement, même si je mets setFocusable(true), ça ne marche pas...

    Ou alors il faut le mettre à un endroit précis (j'ai pas testé trop de combinaisons)

    Je suis tombé sur un autre post où ils parlaient d'utiliser 2 HashMaps pour remplacer la méthode registerKeyboardAction() de la classe JComponent, mais ça me semble un peu compliqué : j'imagine qu'il doit y avoir une solution plus triviale...

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Je poste mon code au cas où :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    public class ModifyPalette extends JDialog implements ActionListener, KeyListener{
     
        [...]
        private boolean isOK = false;
        private JButton bOK, bCancel;
     
     
        public ModifyPalette(Palette pal){
            super();
            this.setTitle("Toto);
            this.setModal(true);
            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            setResizable(false);
            setFocusable(true);
     
            [...]
     
            bOK = new JButton("OK"); 
            bOK.setActionCommand("ok");
            bOK.addActionListener(this);
            panelConfirm.add(bOK);
     
            bCancel = new JButton("Annuler");
            bCancel.setActionCommand("cancel");
            bCancel.addActionListener(this);
            panelConfirm.add(bCancel);
     
            setFocusable(true);
            addKeyListener(this);
     
            this.pack();
            this.setLocationRelativeTo(null);
            bOK.requestFocusInWindow();
            this.setVisible(true);
        }
     
        public void actionPerformed(ActionEvent arg0) {
            String command = arg0.getActionCommand();
     
            if (command == "ok"){
                isOK = true;
                recup_colors();
                dispose();
            }
            else if (command == "cancel"){
                isOK = false;
                dispose();
            }		
        }
     
        [...]
     
        public void keyPressed(KeyEvent arg0) {
        }
     
        public void keyReleased(KeyEvent arg0) {
            if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE)
                bCancel.doClick();
            if (arg0.getKeyCode() == KeyEvent.VK_ENTER)
                bOK.doClick();
        }
     
        public void keyTyped(KeyEvent arg0) {
        }
    }

  5. #5
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    J'apporte quelques explications...

    1) J'avais dans mon code cette ligne :
    2) Si je l'enlève, ça marche (l'appui sur la touche Echap est pris en compte)
    3) Dès qu'un de mes boutons a le focus, l'appui sur la touche Echap ne fonctionne plus...

    Est-ce normal?
    Y'a-t-il un moyen de faire que ma JDialog capte tous les évènements, quelque soit le composant qui a le focus?

  6. #6
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    J'ai l'impression que les InputMaps seraient plus adaptées à ton problème : l'action alt+f4 sur les JFrames n'est pas définie dans un KeyListener mais dans une InputMap (rempli par le LookAndFeel).

    Les InputMaps sont héritées de conteneur en composants. Par exemple les controles des JInternalFrame (ctrl+f4, ctrl+f10, ctrl+f5, ctrl+f6, ...) sont définies dans l'InputMap des DesktopPane, et les JInternalFrame en héritent.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  7. #7
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par xavlours
    J'ai l'impression que les InputMaps seraient plus adaptées à ton problème : l'action alt+f4 sur les JFrames n'est pas définie dans un KeyListener mais dans une InputMap (rempli par le LookAndFeel).

    Les InputMaps sont héritées de conteneur en composants. Par exemple les controles des JInternalFrame (ctrl+f4, ctrl+f10, ctrl+f5, ctrl+f6, ...) sont définies dans l'InputMap des DesktopPane, et les JInternalFrame en héritent.
    Ok, si je suis obligé...
    Je vais regarder la doc, mais si quelqu'un a un exemple de code, je suis preneur

  8. #8
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    J'aimerais pouvoir tester avant de poster, mais cela devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    System.out.println(maJDialog.getActionMap());
     
    // affiche les actions possibles, pour pouvoir en choisir une :
    Object myActionKey;
     
    maJDialog.getInputMap().put(
      KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE),
      myActionKey);
    Il est aussi possible d'ajouter une nouvelle action à l'actionMap avec put.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  9. #9
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bon, j'avais mauvaise conscience de toujours te lancer dans des plans galère, alors je m'y suis mis :
    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
    class TestDialog extends JDialog {
     
    	public static class MyAction extends AbstractAction {
    		public void actionPerformed(ActionEvent e) {
    			System.out.println("Vous avez appuyé sur echap");
    		}
    	}
     
    	public TestDialog() {
    		this.getContentPane().add(new JButton("hello"));
    		this.pack();
    		this.setLocationRelativeTo(null);
    	}	
     
    	public static void main(String[] args) {
    		TestDialog td = new TestDialog();
     
    		Object escapeAction = new Object();
     
    		InputMap im = new InputMap();
    		im.put(KeyStroke.getKeyStroke("ESCAPE"), escapeAction);
     
    		td.getRootPane().setInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, im);
     
    		ActionMap am = td.getRootPane().getActionMap();
     
    		if(am == null)
    			am = new ActionMap();
     
    		am.put(escapeAction, new MyAction());
     
    		if(td.getRootPane().getActionMap() == null)
    			td.getRootPane().setActionMap(am);
     
    		td.setVisible(true);
    	}
     
     
    }
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  10. #10
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Ca marche nickel chrome, merci!

    Maintenant, faut juste que je trouve le moyen le plus propre de centraliser un peu tout ça pour pouvoir le réutiliser dans toutes mes IHM soit avoir faire un copier-coller du code...

    Encore merci!

  11. #11
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Je me suis légèremetn précipiter...

    Quand j'ai un champ texte dans ma JDialog et que celui-ci a le focus, il capte l'évènement clavier et le consomme.
    Du coup, quand j'appuie sur "Esc", ça ne ferme pas ma JDialog...
    Y'a t'il un moyen de propager l'évènement ou de contourner le problème?

  12. #12
    Membre chevronné Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Par défaut
    un KeyListener sur ton JTextField ?

  13. #13
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par let_me_in
    un KeyListener sur ton JTextField ?
    Ouais, mais disons que si y'avait une propriété dans les JTextField, ça m'arrangerait

    Sinon, effectivement, en dernier recours, j'utiliserai un KeyListener...

  14. #14
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    J'ai l'impression que ton problème vient du fait que l'InputMap est définie pour WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, mais pas pour WHEN_FOCUSED.

    Je ne sais pas comment les InputMap sont héritées de Container en Component, alors je ne peux que supposer. As-tu essayé les différents types d'ajout :
    - WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
    - WHEN_FOCUSED
    - WHEN_IN_FOCUSED_WINDOW
    - UNDEFINED_CONDITION

    Les deux derniers donneront peut etre de meilleurs résultats.

    Peut etre aussi que les JTextComponent n'héritent pas automatiquement de l'InputMap de leurs conteneurs, et qu'il faut leur rajouter manuellement les bindings.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  15. #15
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Ouais, j'avais fait ça :
    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
     
    Object escapeAction = new Object();
    		KeyStroke ksEscape = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
    		InputMap im = getRootPane().getInputMap(
    				JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
    		InputMap im2 = getRootPane().getInputMap(
    				JComponent.WHEN_IN_FOCUSED_WINDOW);
    		InputMap im3 = getRootPane().getInputMap(
    				JComponent.WHEN_FOCUSED);
    		ActionMap am = getRootPane().getActionMap();
     
    		im.put(ksEscape, escapeAction);
    		im2.put(ksEscape, escapeAction);
    		im3.put(ksEscape, escapeAction);
     
    		if (am == null)
    			am = new ActionMap();
     
    		am.put(escapeAction, new MyKeyAction(ksEscape.getKeyCode()));
    Mais ça ne donne rien...
    Pour ce qui est de UNDEFINED_CONDITION, ça crashe...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.IllegalArgumentException: condition must be one of JComponent.WHEN_IN_FOCUSED_WINDOW, JComponent.WHEN_FOCUSED or JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT

  16. #16
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 49
    Par défaut
    Bonjour,

    J'ai le même problème et je n'arrive pas à trouver une solution.

    Je voudrais associer le fait d'appuyer sur la touche entrée à une action d'un bouton (en l'occurence le bouton "chercher")
    Je n'arrive pas à comprendre comment fonction le KeyListener

    Voici mon code:

    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
    42
    43
    44
    45
    public class SearchFrame extends JFrame {
     
    // Boutons
    JButton chercher = new JButton(new ImageIcon(SearchFrame.class.getResource("search2.png")));
    [...]
     
    private void jbInit() throws Exception {
     
         int i = 0;
     
      contentPane = (JPanel) getContentPane();
     
         // La fenêtre
         [...]     
     
         // Actions associées aux boutons
         chercher.addActionListener(new SearchFrame_chercher_actionAdapter(this));
    [...]
    }  
     
    // Action du bouton chercher
    public void chercher_actionPerformed(ActionEvent e) throws TextNotAvailableException, NoSuchLocationException{
     [...]
    }
     
    //Adapteur pour les boutons
    class SearchFrame_chercher_actionAdapter implements ActionListener {
        private SearchFrame adaptee;
        SearchFrame_chercher_actionAdapter(SearchFrame adaptee) {
            this.adaptee = adaptee;
        }
        public void actionPerformed(ActionEvent e){
            try{
             adaptee.chercher_actionPerformed(e);
            }catch(NoSuchLocationException nsl){
             System.out.println(nsl);
            }catch(TextNotAvailableException tna){
             System.out.println(tna);
            }
     
        public void keyTyped(KeyEvent e){
         if (e.getKeyCode() == KeyEvent.VK_ENTER)
            adaptee.chercher_actionPerformed(e);
        }
    }
    Merci d'avance.

  17. #17
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 49
    Par défaut
    J'ai fait des modifs mais cela ne marche toujours pas.
    Je me demande si je ne dois pas ajouter un "addKeyListener()" quelquepart, mais je ne sais pas où (dans la class SearchFrame_chercher_actionAdapter, cela ne marche pas).

    MAJ de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Action du bouton chercher
    public void chercher_actionPerformed(ActionEvent e) throws TextNotAvailableException, NoSuchLocationException{
    [...]
    }
     
    public void chercher_actionPerformed(KeyEvent e) throws TextNotAvailableException, NoSuchLocationException{
    [...]
    }

    MAJ de mon adapteur:

    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
     
    //Adapteur pour les boutons
    class SearchFrame_chercher_actionAdapter implements ActionListener,KeyListener {
        private SearchFrame adaptee;
        SearchFrame_chercher_actionAdapter(SearchFrame adaptee) {
             this.adaptee = adaptee;
         }
     
    public void actionPerformed(ActionEvent e){
         try{
              adaptee.chercher_actionPerformed(e);
              } catch(NoSuchLocationException nsl){
                     System.out.println(nsl);
              }catch(TextNotAvailableException tna){
                      System.out.println(tna);
    }
     
    public void keyTyped(KeyEvent e){
    }
     
    public void keyPressed(KeyEvent arg0) {
    }
     
    public void keyReleased(KeyEvent arg0) {
         if (e.getKeyCode() == KeyEvent.VK_ENTER)
          try{
              adaptee.chercher_actionPerformed(e);
              }catch(NoSuchLocationException nsl){
                    System.out.println(nsl);
              }catch(TextNotAvailableException tna){
                     System.out.println(tna);
     
    }

  18. #18
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Ton problème est sensiblement plus simple, et l'API fournit un moyen rapide de gérer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maSearchFrame.getRootPane().setDefaultButton(monBouton);
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

Discussions similaires

  1. KeyListener sur un JFrame
    Par aphilippartd dans le forum Débuter
    Réponses: 6
    Dernier message: 22/01/2009, 19h16
  2. Questions sur JDialog
    Par Zoook dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 03/12/2008, 15h25
  3. [Debutant]KeyListener sur JFrame ne repond pas
    Par Romain93 dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 16/10/2008, 17h44
  4. debutant: un keyListener sur un objet non graphique
    Par ataya dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 18/05/2006, 18h45
  5. JLabel et keylistener sur un JPanel
    Par Azanael dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 19/06/2005, 21h41

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