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

AWT/Swing Java Discussion :

[JButton]Associer un raccourci clavier a certaines touches du clavier ?


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut [JButton]Associer un raccourci clavier a certaines touches du clavier ?
    Salut,

    j'au un certain ensemble d'actions associés a des boutons respectifs ( 14 en tout) et que j'aimerais leur associer des raccourcis clavier bien précis:

    - les touches F1 jusqu'a F12
    - la touche Entrée
    - la touche Echap

    Etant donnée que j'utilise le Jbutton , peut on me dire comment proceder etape par etape ?

    merci

  2. #2
    Membre averti
    Avatar de Orian
    Inscrit en
    Août 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Août 2006
    Messages : 372
    Points : 401
    Points
    401
    Par défaut
    Tu utilise la méthode setMnemonic()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton.setMnemonic('VK_F1');
    iMac 27" 3.06 GHz Intel Core 2 Duo, 4Go DDR3, Mac OS 10.6.5
    MacBook Pro 17", 2,3 GHz Intel Core 2 Duo, 2 Go DDR2, Mac OS 10.4.11

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut
    je ne pense pas que ca puisse marcher car VK_F1 n'est pas un caractere ni un entier , il faudra un argument compatible a setmnemonic mais lequel dans mon cas !

  4. #4
    Membre averti
    Avatar de Orian
    Inscrit en
    Août 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Août 2006
    Messages : 372
    Points : 401
    Points
    401
    Par défaut
    Exact, erreur de ma part...Utilise un KeyListenner alors.
    iMac 27" 3.06 GHz Intel Core 2 Duo, 4Go DDR3, Mac OS 10.6.5
    MacBook Pro 17", 2,3 GHz Intel Core 2 Duo, 2 Go DDR2, Mac OS 10.4.11

  5. #5
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    Vois aussi How to Use Key Bindings. Si tu comprends pas l'anglais dis-le et j'essaierai d'expliquer.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Dans le cas d'un Menu et d'un MenuItem :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    menu.setAccelerator(KeyStroke.getKeyStroke("F1"));
    Pour un bouton tu peux aussi essayer de lui associe une Action dont la propriete ACCELERATOR_KEY pointe sur le bon KeyStroke. Mais je n'ai jamais trop essaye si les saisies clavier sont correctement interceptees apres.

    Sinon, de maniere plus generale, l'ActionMap et l'InputMap (ce qu'a indique spekal) permettent en effet de rendre completement customisable l'interface graphique, y compris sur les boutons.
    De toute maniere tu vas avoir tendance a centraliser ce que tu fais dans des Action de maniere a eviter de dupliquer du code dans les menu et les boutons...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut
    merci pour vos réponses, mais j'avoue que je suis toujours bloqué .. y as pas un moyen le plus simple possible pour assosier cette touche de clavier en particulier ( F1..F12 ) a mon bouton , j'avoue que ce que vous avez suugéré est un peu du chinois pour moi
    merci

    j'ai juste oublié de dire que mes boutons en font pas parti d'un menu , mais des boutons Jbutton classiques
    merci

  8. #8
    Membre confirmé Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Points : 510
    Points
    510
    Par défaut
    Tu es bloqué où ? As-tu commencé à suivre l'une des techniques que l'on t'a indiquées (Action et accelerator_key, ou key binding) ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut
    je ne peux apparamment pas utiliser les accelerator_key pour mes jbuttons, ca ne figure meme pas dans la liste des methodes / attributs de ce component

  10. #10
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Lorsque tu as plusieurs points d'entrée pour une même action (bouton, touche de raccouris, menus, etc), la classe Action est ton alliée : http://java.sun.com/docs/books/tutor...sc/action.html

    Chris.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut
    oui c'est tres interessant ..;mais je ne vois pas comment associer les touches F1..F12 aux 1é boutons dont je dispose .. comment ajouter ca ?

  12. #12
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Pas le temps de tester, mais qqc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Action myAction = new myDefinedAction();
    myAction.putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_F1));
     
    JButton myButton = new JButton(myAction);

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut
    j'ai compris ton idée et le principe aussi , mais il se trouve que j'ai déja affecté des actionlistners aux boutons , alors comment prendre en compte la classe Action afin de leur ajouter la fonction putvalue()?

    j'ai part exemple un listner():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     static class monlistner implements Actionlistner
    {
     public void actionperformed(...)
    {
       // mon code ici 
    }
    }
    ce dode fonctionne bien sur , mais il me reste a l'annoter pour prendre en compte l'interface Action que tu viens de me suggerer ; mais comment ?
    merci encore

  14. #14
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    S'il n'y a que la fonction actionperformed() dans ton listener, tu peux faire migrer tout ta fonction dans l'homologue de la classe myDefinedAction.

    Cela donnera quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class myDefinedAction extends AbstractAction {
        public myDefinedAction() {
            super();
        }
        public void actionPerformed(ActionEvent e) {
            // Ton code ici
            // Tu reprends le code de la focntion actionperformed() de ton listener
        }
    }

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut
    j'ai essayé comme tu l'a suggéré :

    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
     
     
    static class MyListner extends AbstractAction
    {
    	public MyListner()
    	{
    		super();
    	}
     
    	public void actionPerformed(ActionEvent event) 
        {		 
    		new GPSDataWindow(new GPSWindowPattern()); // un truc a moi qui s'affiche
    	}
     
    }
    et a mon bouton j'ai mis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    MyListner myl = new MyListner();
    myl.putValue("F1", new Integer(KeyEvent.VK_F1));
    bouton1.addActionListener(myl);
    mais la fenetre ne s'affiche pas , donc l'action ne s'excute pas ;(

    je comprends pas ;(

  16. #16
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Lorsque tu écris cela :
    Citation Envoyé par jlassiramzy
    myl.putValue("F1", new Integer(KeyEvent.VK_F1));
    Je ne suis pas d'accord.
    Le premier argument de putValue est un mot clef, mais pas TON mot clef.
    "MNEMONIC_KEY" correspond, à priori, à l'ajout de ton raccourci clavier. (Cf. http://javasearch.developpez.com/j2s...ng/Action.html pour la liste des mots clef. Section Field Summary)

    Perso, j'aurai essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myl.putValue(MNEMONIC_KEY, new Integer(KeyEvent.VK_F1));

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut
    tu veux dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myl.putValue(AbstarctAction.MNEMONIC_KEY, new Integer(KeyEvent.VK_F1));
    mais j'ai ezssayé et ca ne marche pas , j'ai essayé de taper sur la touche F1 mais rien ne se passe comme avant

  18. #18
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Voici un exemple tout bête :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     /*
     * TstAction.java
     */
     
    package tst;
     
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JButton;
     
    /**
     *
     * @author  Chris
     */
    public class TstAction extends javax.swing.JFrame {
     
        Action myAction = new MyDefinedAction();
     
        /** Creates new form TstAction */
        public TstAction() {
            initComponents();
            myAction.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_F1));
        }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
        private void initComponents() {
            jButton1 = new JButton(myAction);
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            jButton1.setText("jButton1");
     
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jButton1)
                    .addContainerGap(317, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jButton1)
                    .addContainerGap(266, Short.MAX_VALUE))
            );
            pack();
        }// </editor-fold>                        
     
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new TstAction().setVisible(true);
                }
            });
        }
     
        // Variables declaration - do not modify                     
        private javax.swing.JButton jButton1;
        // End of variables declaration                   
     
        class MyDefinedAction extends AbstractAction {
            public MyDefinedAction() {
                super();
            }
            public void actionPerformed(ActionEvent e) {
                // Ton code ici
                // Tu reprends le code de la focntion actionperformed() de ton listener
                System.out.println("Coucou");
            }
        }
     
    }

    Cela peut éventuellement t'aiguiller. Ce n'est pas trés beau, mais cela montre que ça fonctionne.

    Sinon, une question me vient en tête : es-tu sûr que ton événement (l'appui sur la touche F1) n'est pas mangé par un de tes contrôle ?

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 418
    Points : 67
    Points
    67
    Par défaut
    oui sur , car c'est le seul endroit ou je l'utilise, je voulais juste améliorer mes anciens listeners ensupportant ces touches

  20. #20
    Membre averti

    Profil pro
    Coach Agile
    Inscrit en
    Décembre 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Coach Agile

    Informations forums :
    Inscription : Décembre 2005
    Messages : 316
    Points : 371
    Points
    371
    Par défaut
    Je pensais éventuellement a des default keymap affectées à certains contrôles.
    Dans le lot, il peut y en avoir une qui mange le F1. Auquel cas, il sera nécessaire de d'abord lui retirer cette attribution.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/11/2007, 14h36
  2. interdire certaine touche du clavier
    Par Renardo dans le forum Access
    Réponses: 14
    Dernier message: 19/08/2006, 20h27
  3. Associer un son ou une musique à une touche du clavier
    Par Revan777 dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/04/2006, 21h33
  4. désactiver certaines touches du clavier...
    Par youp_db dans le forum C
    Réponses: 4
    Dernier message: 23/01/2006, 15h21

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