在Java/Swing中更改助记符修饰键

6

在Swing中设置焦点快捷键非常简单:

  tfldPlantsNeeded = new JTextField( FIELD_LEN_MED );
  lblPlantsNeeded = new JLabel( "Plants Needed" );
  lblPlantsNeeded.setDisplayedMnemonic( 'p' );
  lblPlantsNeeded.setLabelFor( tfldPlantsNeeded );

当用户按下“ALT + p”时,这将使焦点放在`tfldPlantsNeeded` JTextField上。它还会突出显示/显示触发焦点更改的字符。(在这种情况下,当按下`ALT`时,“Plants”中的“P”被强调为下划线。)
这很好 ... 嗯,有点。在Mac上,当用户按下`ALT`(也是Mac键盘上的`Option`)时,助记符被高亮显示,但当按下`p`时,焦点不会改变。然而,如果用户按下`Control + Option + p`,那么它按照“预期”工作,并且焦点被改变。(顺便说一句,如果用户确实按下`Option + p`,则当前聚焦的文本字段将插入奇怪的字符。)
我知道我可以通过`getInputMap`和`getActionMap`指定自定义键绑定来自己完成这项工作,但是否有一种方法可以更改应用程序全局助记符修饰符,以便我们可以使用自动键绑定和触发字符突出显示? (在我的情况下,我想使用`Command`或`Meta`作为助记符修改器键。)

是的(从未尝试过),这些加速器是 - 1. TextAction 或 2. UIManager。 - mKorbel
1个回答

2
显然,这并没有你想象的那么简单,但是有方法。
首先, 对于菜单(JMenu)来说,有一种由外观控制的属性称为Menu.shortcutKeys,您可以手动设置它。这样就为特定外观中的菜单设置了助记符修改器。如果您想了解更多信息,请随时问。
要设置所有内容的助记符修饰符,需要覆盖默认工具包(Toolkit)。首先,运行一个主方法以查找它,使用以下代码。
System.out.println(System.getProperty("java.awt.headless"));
System.out.println(System.getProperty("awt.toolkit"));

如果第一行是null或者false(参见java.awt.Toolkit getDefaultToolkit()),那么第二行将会给出你的系统中默认使用的工具包的类名。我使用Windows,第二行输出的内容为sun.awt.windows.WToolkit。现在创建一个类来覆盖你默认工具包中的getFocusAcceleratorKeyMask方法。对于我来说,它看起来像这样:
public class MyToolkit extends WToolkit {

    @Override
    public int getFocusAcceleratorKeyMask() {
        return InputEvent.CTRL_DOWN_MASK;
    }
}

最后,我们需要告诉系统使用它。在您的应用程序中,加入以下代码:

System.setProperty("awt.toolkit", "packagename.MyToolkit");

您需要将正确的包路径设置到您的类中。确保此行位于任何GUI相关代码之前,最好放在main的前几行。这应该将CONTROL设置为全局助记符修改器(或者使用META_DOWN_MASK如果您想要那样。请查看java.awt.event.InputEvent获取MASK列表)。


WToolkit是最终版本,无法进行扩展。 - Paul Erlenmeyer

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