6

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

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

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

这很棒……嗯,有点。在 Mac 上,当用户按下ALT(也在OptionMac 键盘上)时,助记符会突出显示,但p按下时也不会触发焦点更改。但是,如果用户按下Control + Option + p,那么它会按“预期”工作并且焦点会改变。(顺便说一句,如果用户按下Option + p,当前聚焦的文本字段将插入有趣的字符。)

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

4

1 回答 1

2

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

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

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

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

如果第一行是nullof false(参见 参考资料java.awt.Toolkit getDefaultToolkit()),那么第二行将为您提供类名,该类名用作您系统的默认 Toolkit。我使用 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.InputEventMASK 列表。)。

于 2014-03-24T20:05:19.633 回答