Java Swing JMenu Mnemonic

9

我有一个使用JMenu创建的菜单。我想将快捷键Alt-F分配给这个菜单。我使用setMnemonic('F')来实现,但是菜单没有识别助记符。

如何最好地解决或调试此问题?我发现设置断点并没有太大帮助。

谢谢。

代码片段:

//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');

我认为我们需要看一些代码。 - robert_x44
为什么有人会点赞这个问题?这是基础知识。发帖者只需阅读JMenu API,找到关于“如何使用菜单”的Swing教程链接,即可获得工作示例。为什么要奖励懒惰的人积分?此外,如果没有SSCCE,我们浪费时间猜测发帖者可能做错了什么,所以这个问题甚至都不是一个完整的问题。 - camickr
2
我发现JMenu助记符与按钮助记符的行为不同。当我想使用助记符点击按钮时,我只需按下Alt键,然后按下快捷键字母即可。但是对于JMenu,我必须:按下Alt键,等待Swing突出显示第一个菜单,使用箭头键选择其他菜单或按相应的快捷字母选择菜单。 - zfranciscus
3个回答

6

在类构造器(扩展JFrame)中:

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

对我来说效果很好。如果您能提供更多关于您的代码的细节,那么我可以给出更好的答案。就SWING或任何应用程序GUI的故障排除而言,我可以给出最好的建议之一是创建最简单的可能情况。我保留了一个最基本的JFrame模板,可以将此类简单代码放入其中进行测试。一旦您知道它在最简单的场景中起作用,您可以回到您的项目并发现导致此功能冲突的GUI的其他部分。

只是出于好奇,您的构造函数中是否有名为“uiFindMnu”的局部变量覆盖了您的类变量?我会仔细检查以确保调用setMnemonic()的变量是添加到您的MenuBar(实际显示)的变量。


1
好的回答,但是“扩展JFrame”不是一个好主意(https://dev59.com/g3M_5IYBdhLWcg3w-4dg)。 - user439793

3

使用 setMnemonic(KeyEvent.VK_F);

我建议您阅读关于JMenus的内容:如何使用菜单

以下是该文章的摘录:

菜单支持两种键盘替代方法:助记符和加速器。助记符提供了一种使用键盘导航菜单层次结构的方式,增加了程序的可访问性。另一方面,加速器提供了绕过导航菜单层次结构的键盘快捷键。助记符适用于所有用户;加速器适用于高级用户。

助记符是使已经可见的菜单项被选中的键。例如,在MenuDemo中,第一个菜单具有助记符A,其第二个菜单项具有助记符B。这意味着,当您在Java外观下运行MenuDemo时,按下Alt和A键会使第一个菜单出现。在第一个菜单可见时,按B键(带或不带Alt)会选择第二个菜单项。菜单项通常通过在菜单项文本中的助记符字符的第一次出现下划线来显示其助记符,如下图所示。 B是此菜单项的助记符字符

您可以在构造菜单项时或使用setMnemonic方法来指定助记符。以下是设置助记符和加速器的示例:

//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);

正如您所看到的,您可以通过指定与用户应按下的键对应的KeyEvent常量来设置助记符。

我会尝试一下,并告诉大家结果。 - zfranciscus
@zfranciscus 我编辑了我的帖子,并附上了一个链接,解释了关于JMenus的一切你需要知道的内容 :) - LaGrandMere

3

我遇到了类似的问题,并意识到在初始化组件后由于“外观”设置导致了这个问题。反转语句后问题得到解决。

这里发布了一篇博客文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接