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

Cla*_*ton 5 java user-interface swing mnemonics

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

  tfldPlantsNeeded = new JTextField( FIELD_LEN_MED );
  lblPlantsNeeded = new JLabel( "Plants Needed" );
  lblPlantsNeeded.setDisplayedMnemonic( 'p' );
  lblPlantsNeeded.setLabelFor( tfldPlantsNeeded );
Run Code Online (Sandbox Code Playgroud)

这将tfldPlantsNeeded在用户按下时将焦点放在JTextField上ALT+p.它还会突出显示/显示将触发焦点变化的角色.(在这种情况下,ALT按下时,"植物"中的'P'加下划线.)

这很棒......好吧,有点儿.在Mac上,当用户按下时ALT(也在OptionMac键盘上),助记符处于高位,但是在p按下时也不会触发焦点更改.但是,如果用户按下Control + Option + p,则其工作为"预期"并且焦点被改变.(另外,如果用户按下Option + p,则当前聚焦的文本字段将插入有趣的字符.)

我知道我可以通过getInputMap和指定自定义键绑定来自己做getActionMap,但有没有办法更改应用程序全局助记符修饰符,以便我们可以使用自动键绑定和触发字符突出显示?(就我而言,我想使用CommandMeta作为助记符修饰键.)

use*_*551 2

显然这并不像您想象的那么简单,但有一种方法。

首先,对于菜单 ( JMenu),有一个由外观控制的属性,Menu.shortcutKeys您可以手动设置该属性。这会设置特定外观中菜单的助记符修饰符。如果您想了解更多相关信息,请随时询问。

为了设置所有内容的助记符修饰符,您需要覆盖默认工具包(Toolkit)。首先,运行一个 main 方法来查找它是什么,如下所示

System.out.println(System.getProperty("java.awt.headless"));
System.out.println(System.getProperty("awt.toolkit"));
Run Code Online (Sandbox Code Playgroud)

如果第一行是(请参阅参考资料null),那么第二行将为您提供类名称,该名称用作系统的默认 Toolkit。我使用 Windows,第二行给出输出。现在创建一个在默认工具包中覆盖的类。对我来说,它看起来像这样falsejava.awt.Toolkit getDefaultToolkit()sun.awt.windows.WToolkitgetFocusAcceleratorKeyMask

public class MyToolkit extends WToolkit {

    @Override
    public int getFocusAcceleratorKeyMask() {
        return InputEvent.CTRL_DOWN_MASK;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我们必须告诉系统使用它。在您的应用程序中,将行

System.setProperty("awt.toolkit", "packagename.MyToolkit");
Run Code Online (Sandbox Code Playgroud)

您需要在其中设置类的正确包路径。确保在启动任何 GUI 相关代码之前放置此行,最好放在main. 现在应该将其设置CONTROL为全局助记符修饰符(或者META_DOWN_MASK如果您想要的话使用它。查看java.awt.event.InputEventMASK 列表。)。