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

Interfaces Graphiques en Java Discussion :

Utilisation des mnémoniques et accélérateurs


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut Utilisation des mnémoniques et accélérateurs
    Bonjour à tous,

    J'aimerais comprendre comment on utilise les mnémoniques et accélérateurs.

    A priori, mais je dis bien a priori, j'ai réussi à les utiliser dans le code suivant. Mon problème est que je ne sais pas, une fois le programme lancé, comment on fait pour générer les événements leur correspondant.

    J'ai l'impression que certains accélérateurs fonctionnent et d'autres non (genre ceux avec la touche ALT, mais pas ceux avec la touche CTRL...). Enfin, lorsque j'enfonce la touche ALT, je vois bien les lettres soulignées des mnémoniques, mais impossible de les utiliser. Cela dit, je ne sais pas ce qu'il faut faire : ALT + la lettre ne donne rien sur les éléments du menu, alors que si je clique avec la souris sur un menu et que j'appelle ensuite la lettre d'un mnémonique de son sous menu, celui-ci a bien lieu...

    Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?

    Merci d'avance pour votre aide.
    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
    85
    86
    87
    import java.awt.Container;
    import java.awt.event.*;
     
    import javax.swing.JMenu;
    import javax.swing.JMenuItem;
    import javax.swing.JMenuBar;
    import javax.swing.JPanel;
    import javax.swing.KeyStroke;
    import javax.swing.JFrame;
     
    @SuppressWarnings("serial")
    public class essai3 extends JFrame implements ActionListener {
     
        public essai3() {
            // Caracteristiques de la fenetre
            int width = 200;
            int height = 200;
            this.setTitle("Essai de mnemoniques et accelerateurs");
            this.setBounds(100, 100, width, height);
     
            // Container
            Container container = this.getContentPane();
            container.add(new JPanel());
     
            // Barre de menu
            this.setJMenuBar(this.createMenuBar());
     
        }
     
        public JMenuBar createMenuBar() {
            JMenuBar menuBar;
            JMenu menu, edition;
            JMenuItem menuItem;
     
            // menu bar
            menuBar = new JMenuBar();
     
            // menu
            menu = new JMenu("Menu");
            menu.setMnemonic(KeyEvent.VK_M);
            menuBar.add(menu);
     
            // edition
            edition = new JMenu("Edition");
            edition.setMnemonic(KeyEvent.VK_E);
            menuBar.add(edition);
     
            // contenu de menu
            menuItem = new JMenuItem("Ouvrir", KeyEvent.VK_O);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.ALT_MASK));
            menu.add(menuItem);
     
            menuItem = new JMenuItem("Fermer", KeyEvent.VK_F);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, ActionEvent.ALT_MASK));
            menu.add(menuItem);
     
            menuItem = new JMenuItem("Sauvegarder", KeyEvent.VK_S);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
            menu.add(menuItem);
     
            // contenu de menu
            menuItem = new JMenuItem("Annuler", KeyEvent.VK_A);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, ActionEvent.CTRL_MASK));
            edition.add(menuItem);
     
            menuItem = new JMenuItem("Zoom", KeyEvent.VK_Z);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, ActionEvent.CTRL_MASK));
            edition.add(menuItem);
     
            // Retour
            return menuBar;
        }
     
        public void actionPerformed(ActionEvent e) {
            System.err.println("Action : " + e.getActionCommand());
        }
     
        public static void main(String[] args) {
            essai3 fenetre = new essai3();
            fenetre.setVisible(true);
        }
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Les mnémoniques sont fait pour fournir une alternative à la souris (pour les machines n'en disposant pas) : il s'agit d'une touche simple, toujours composée avec un seul modifier (habituellement ALT, en tout cas sur Windows).

    Les accélérateurs correspondent à ce qu'on appelle plus communément les raccourcis clavier (short cut) : il s'agit d'une alternative à ceux qui veulent faire une action plus vite qu'à la souris. Un accélérateur est une combinaison de plusieurs touches (des modifiers (Control, Shift, Alt...) et une autre touche commune (A, B...Entrée, Espace...). Iln'est pas forcément associé à un bouton ou un menu d'ailleurs (j'ai dans mon application des raccourcis clavier qui font une action particulière avec des caractéristiques ( pour l'exemple, CTRL-SHIFT-N correspond "créer une page juste après la dernière page actuellement sélectionnée") qui obligent à entrer plusieurs informations (options) dans un formulaire qu'on obtient lorsqu'on utilise l'action standard).

    La différence est subtile certes. Elle existe également dans le comportement et l'usage. Fait ce test : modifie le mnémonic de ton menu Quitter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    menuItem = new JMenuItem("Fermer", KeyEvent.VK_Q);
    menuItem.addActionListener(this);
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, ActionEvent.ALT_MASK));
    menu.add(menuItem);
    Lances l'appli et fait directement ALT-F. Tu vois l'affichage de la trace "Action : Fermer". L'action associée au menu est bien déclenchée : tu as un moyen rapide de déclencher l'action qu'on déclencherait si on cliquais sur le menu Fermer, qu'on ne peut avoir que si on a afficher le menu Menu avant. ALT-F fait donc gagner 2 clics.

    Maintenant fait ALT-Q : rien ne se passe. En effet, ce mnémonique n'est disponible que si le menu est affiché. Il faut donc ouvrir le menu Menu pour pouvoir déclencher l'action du menu Fermer avec ALT-Q. Ce qu'on peut faire également par ALT-M puis ALT-Q, le premier ouvrant le menu Menu.

    En général, pour les raccourcis (c'est l'usage sur Windows en tout cas), on utilise plutôt CTRL ou CTRL-SHIFT que ALT. Sur Macintosh, on utilisera plutôt META à la place de CTRL (qui correspond à la touche COMMAND du MAC, qu'on appelle communément POMME ou APPLE pour les anglicistes).

    Le plus compliqué étant de veiller à ce qu'aucun mnémonique entre en conflit avec un accélateur. Si tu configures tes menu comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     menuItem = new JMenuItem("Ouvrir", KeyEvent.VK_X);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.ALT_MASK));
            menu.add(menuItem);
     
    ...
     menuItem = new JMenuItem("Sauvegarder", KeyEvent.VK_S);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
            menu.add(menuItem);
    Et que tu testes en faisant ALT-M, ALT-X, çà t'affichera "Action : Ouvrir", alors que, menu fermé, ALT-X fera "Action : Sauvegarder".
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Le plus compliqué étant de veiller à ce qu'aucun mnémonique entre en conflit avec un accélateur. Si tu configures tes menu comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     menuItem = new JMenuItem("Ouvrir", KeyEvent.VK_X);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.ALT_MASK));
            menu.add(menuItem);
     
    ...
     menuItem = new JMenuItem("Sauvegarder", KeyEvent.VK_S);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
            menu.add(menuItem);
    Et que tu testes en faisant ALT-M, ALT-X, çà t'affichera "Action : Ouvrir", alors que, menu fermé, ALT-X fera "Action : Sauvegarder".
    Salut Joel et merci pour ta réponse précise et pédagogique ! C'est super cool d'avoir des gens comme toi prêt à passer beaucoup de temps à pondre des super réponses comme cela.

    Lorsque je fait le second teste que tu indiques, le ALT-M, ALT-X affiche "Action : Sauvegarder" et non "Action : Ouvrir". C'est comme si l'accélérateur passait en priorité devant le mnémonique. A moins que les mnémoniques ne fonctionnent tout simplement pas. En effet si je commente les lignes déclarant les accélérateurs dans le code que j'ai donné dans le premier message, je n'arrive à déclencher aucune action...

    Plutot que de mettre des X, j'ai mis des V dans le test pour être sur que le mnémonique soit bien présent, car 'ouvrir' ne contenant pas de X, je ne pense pas que celui ci soit bien pris en compte. Ceci dis, cela ne change rien au résultat chez moi....

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui le mnémonique devient prioritaire sur l'accélérateur, lorsque le contexte fait que le mnémonique est "actif". Mais le mnémonique reste disponible même si le texte ne contient pas le caractère.

    Tu peux t'amuser à faire des essais et de voir ce que ça donne. Tiens, par exemple, regardes un peu ce que ça donne si tu met le même mnémonique pour Ouvrir et Fermer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    menuItem = new JMenuItem("Ouvrir", KeyEvent.VK_X);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.ALT_MASK));
            menu.add(menuItem);
     
            menuItem = new JMenuItem("Fermer", KeyEvent.VK_X);
            menuItem.addActionListener(this);
            menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, ActionEvent.ALT_MASK));
            menu.add(menuItem);
    Il faut que le menu Menu soit ouvert bien sûr pour faire ce test. Étonnant n'est-ce-pas ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Il faut que le menu Menu soit ouvert bien sûr pour faire ce test. Étonnant n'est-ce-pas ?
    Sympa le fait de pouvoir passer en revue tous les items ayant le même mnémonique ! Vraiment cool, même !

    Par contre, comment peut on faire pour ouvrir le menu sans utiliser la souris ? J'arrive bien à utiliser la souris sur les sous menu lorsque je clique sur l'intitulé du menu avec la souris. Mais pour les menu eux memes, je n'arrive pas à utiliser les Mnémoniques.

    Je tape Alt-M pour essayer d'arriver à celui du menu, mais rien ne se passe. Est ce bien comme cela ? Qu'est ce que je n'ai pas compris ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tolliob Voir le message
    Sympa le fait de pouvoir passer en revue tous les items ayant le même mnémonique ! Vraiment cool, même !
    Moui, peut-être, mais les actions n'en sont pas moins pas déclenchées, ce qui est plutôt gênant.


    Citation Envoyé par tolliob Voir le message
    Mais pour les menu eux memes, je n'arrive pas à utiliser les Mnémoniques.
    Ils devraient fonctionner pourtant. La fenêtre doit avoir le focus, c'est tout à priori. On peut avoir des problèmes avec les caractères qui ne sont pas directement une touche (comme les chiffres de la barre au dessus du clavier, qu'on obtient normalement avec shift) parce qu'un mnemonique est insensible à la casse (shift n'agit pas sur lui) : en clair, on ne peut pas utiliser les chiffres au dessus du clavier pour déclencher un mnémonique, la touche considérée correspondant au caractère bas de la touche (voir l'autre discussion dont j'ai mis le lien et qui aborde le le sujet)

    Je tape Alt-M pour essayer d'arriver à celui du menu, mais rien ne se passe. Est ce bien comme cela ? Qu'est ce que je n'ai pas compris ?
    Oui, c'est bien comme ça. Même s'il y avait un autre composant dans la fenêtre, comme un JButton, avec le même mnémonique, le menu serait prioritaire.
    Maintenant, il y a peut être un mnémonique de ton système qui intercepte la touche... (par exemple, ALT-F4 sous Windows ferme bien la fenêtre courante).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Pour le moment, ça me dépasse un peu...

Discussions similaires

  1. Règles d'utilisation des forums C
    Par Franck.H dans le forum C
    Réponses: 3
    Dernier message: 26/01/2008, 17h35
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

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