【问题标题】:Java Swing JMenu MnemonicJava Swing JMenu 助记符
【发布时间】:2011-05-25 00:12:47
【问题描述】:

我有一个使用 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');

【问题讨论】:

  • 我想我们需要看看一些代码。
  • 为什么有人会赞成这个问题?这是基本的东西。发帖者所要做的就是阅读 JMenu API 以找到指向“如何使用菜单”的 Swing 教程的链接以获取工作示例。为什么要奖励懒惰的人?不仅没有SSCCE,我们还在浪费时间猜测发帖人可能做错了什么,所以这个问题甚至不是一个完整的问题。
  • 我发现 JMenu 助记符与按钮助记符的行为不同。当我想使用助记符点击按钮时,我可以简单地按 Alt,然后按快捷键。使用 JMenu,我必须:按下 Alt 按钮,等待 Swing 突出显示第一个菜单,使用箭头键选择其他菜单或按相应的快捷键选择菜单。

标签: java swing


【解决方案1】:

类构造函数内部(扩展 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(并实际显示)的变量。

【讨论】:

  • 很好的答案,但它是not a good idea 来“扩展(ing)JFrame”
【解决方案2】:

遇到类似问题,发现是由于初始化组件后的外观设置造成的。翻转语句,它起作用了。

发表博文here

【讨论】:

    【解决方案3】:

    使用setMnemonic(KeyEvent.VK_F);

    我建议您阅读有关 JMenus 的文章:Howto use Menus

    这里是这篇文章的摘录:

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

    助记符是使已经可见的菜单项被选中的键。 例如,在 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 用链接编辑了我的帖子,解释了您需要了解的有关 JMenus 的所有信息 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多