2010-12-14 6 views
7

J'ai un menu que j'ai créé en utilisant JMenu. Je veux assigner une touche de raccourci Alt-F à ce menu. J'ai utilisé setMnemonic ('F') pour faire cela, mais le menu ne reconnaît pas le mnémonique.Java Swing JMenu Mnémonique

Quelle est la meilleure façon de résoudre ou de déboguer ce problème? Je trouve que fixer un point de rupture n'aide pas beaucoup.

Merci.

Code Snippet:

//higher up in variable declaration 
/** Menus on the menu bar */ 
private JMenu uiFindMnu   = new JMenu("Find"); 
... 
//inside the constructor 
// set mnemonic for the Find menu 
uiFindMnu.setMnemonic('F'); 
+0

Je pense que nous allons avoir besoin de voir le code. –

+0

Pourquoi quelqu'un aurait-il voté pour cette question? C'est un truc de base. Tout ce que l'affiche a à faire est de lire l'API JMenu pour trouver un lien vers le tutoriel Swing sur "Comment utiliser les menus" pour un exemple de travail. Pourquoi récompenser les gens avec des points pour être paresseux? Non seulement, sans un SSCCE, nous perdons du temps à deviner ce que l'affiche aurait pu faire de mal, donc la question n'est même pas complète. – camickr

+1

J'ai trouvé que JMenu Mnemonic se comporte différemment d'un mnémonique de bouton. Lorsque je veux cliquer sur un bouton en utilisant le mnémonique, je peux simplement appuyer sur Alt suivi de la lettre raccourcie. Avec JMenu, je dois: Appuyez sur le bouton Alt, attendez que Swing éclaire le premier menu, utilisez la touche fléchée pour choisir un autre menu ou appuyez sur les alphabets de raccourcis correspondants pour sélectionner le menu. – zfranciscus

Répondre

1

Utilisez setMnemonic(KeyEvent.VK_F);

Je vous recommande de lire ceci à propos JMenus: Howto use Menus

Voici un extrait de cet article:

support menus deux types d'alternatives de clavier: mnemonics et accélérateurs. Mnemonics offre un moyen d'utiliser le clavier pour naviguer dans la hiérarchie des menus, ce qui augmente l'accessibilité des programmes. Les accélérateurs, d'autre part, offrent des raccourcis clavier pour contourner naviguant dans la hiérarchie des menus. Mnemonics sont pour tous les utilisateurs; les accélérateurs sont pour les utilisateurs avec pouvoir.

Un mnémonique est une clé qui permet de sélectionner un élément de menu déjà visible. Par exemple, dans MenuDemo le premier menu a le mnémonique A, et son deuxième élément de menu a le mnémonique B. Cela signifie que, lorsque vous exécutez MenuDemo avec l'apparence Java, en appuyant sur les touches Alt et A rend le le premier menu apparaît. Alors que le premier menu est visible, en appuyant sur , la touche B (avec ou sans Alt) permet de choisir le deuxième élément du menu. Un élément de menu affiche généralement sa mnémonique en soulignant la première occurrence du caractère mnémonique dans le texte de l'élément de menu, sous la forme de l'instantané suivant. B est le caractère mnémonique de ce menu article

Vous pouvez spécifier un mnémonique lors de la construction de l'élément de menu ou avec la méthode setMnemonic. Voici des exemples de configuration mnémoniques et des accélérateurs:

//Setting the mnemonic when constructing a menu item: 
menuItem = new JMenuItem("A text-only menu item", 
         KeyEvent.VK_T); 

//Setting the mnemonic after creation time: 
menuItem.setMnemonic(KeyEvent.VK_T); 

Comme vous pouvez le voir, vous définissez un mnémonique en spécifiant la constante correspondant KeyEvent à la presse devrait touche l'utilisateur.

+0

J'essaierai et je ferai savoir à tout le monde le résultat – zfranciscus

+0

@zfranciscus J'ai édité mon post avec un lien expliquant tout ce que vous devez savoir sur JMenus :) – LaGrandMere

5

A l'intérieur d'un constructeur de classe (extension JFrame):

JMenu helpmenu = new JMenu("File"); 
helpmenu.setMnemonic('F'); 
JMenuBar menubar = new JMenuBar(); 
menubar.add(helpmenu); 
setJMenuBar(menubar); 

Cela a bien fonctionné pour moi. Vous devrez donner plus de détails sur votre code pour que je puisse donner une meilleure réponse. En ce qui concerne le dépannage de SWING ou de toute interface graphique d'application, l'une des meilleures recommandations que je puisse faire est de créer le scénario le plus simple possible. Je garde un gabarit JFrame à la base, que je peux jeter un code simple comme celui-ci à l'intérieur pour le tester. Une fois que vous savez que cela fonctionne dans le scénario le plus simple, vous pouvez revenir à votre projet et découvrir quelle autre partie de votre interface graphique provoque un conflit avec cette fonctionnalité.Juste par curiosité, il ne vous arrive pas d'avoir une variable locale appelée 'uiFindMnu' dans votre constructeur qui cache votre variable de classe, n'est-ce pas? Je vérifie pour m'assurer que la variable que vous appelez setMnemonic() on est celle qui est ajoutée à votre MenuBar (et affichée).

+0

Merci, cela a été vraiment utile – zfranciscus

+0

Bonne réponse, mais ce n'est pas une bonne idée] (http://stackoverflow.com/q/1143923/439793) pour "étendre (ing) JFrame" –

2

Souffert avec un problème similaire et réalisé que, en raison du réglage de Voir et sentir après l'initialisation des composants causé le problème. Flipped les déclarations et cela a fonctionné.

Publié un blog here