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

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

当用户按下tfldPlantsNeeded时,它将把焦点放在ALT+p JTextField上。它还会突出显示/显示将触发焦点更改的字符。 (在这种情况下,当按下ALT时,“Plants”中的“P”带有下划线。)

太好了...好吧,有点。在Mac上,当用户按下ALT(在Mac键盘上也是Option)时,助记符被高亮显示,但是当按下p时也不会触发焦点更改。但是,如果用户按Control + Option + p,则它按“预期”方式工作,并且焦点已更改。 (顺便说一句,如果用户确实按下Option + p,则当前关注的文本字段将插入有趣的字符。)

我知道我可以自己通过getInputMapgetActionMap指定自定义键绑定(bind)来做到这一点,但是是否可以更改应用程序全局助记符以便我们可以使用自动键绑定(bind)并触发字符突出显示? (就我而言,我想使用CommandMeta作为助记符修饰符。)

最佳答案

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

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

为了设置所有内容的助记符,您需要覆盖默认工具包(Toolkit)。首先,使用以下几行运行main方法来查找它的含义

System.out.println(System.getProperty("java.awt.headless"));
System.out.println(System.getProperty("awt.toolkit"));

如果第一行是nullfalse(请参阅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");

您需要在其中为您的类(class)设置正确的包路径。确保在开始任何与GUI相关的代码之前放置此行,最好在main的第一行中。现在,这应该将CONTROL设置为全局助记符修饰符(或者,如果需要的话,请使用META_DOWN_MASK。请在java.awt.event.InputEvent中查找MASK列表。)。

10-05 19:17