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

时间:2014-03-11 12:42:47

标签: java swing user-interface mnemonics

在Swing中设置焦点热键很容易:

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

当用户按下tfldPlantsNeeded时,这将关注ALT+p JTextField。它还会突出显示/显示将触发焦点变化的角色。 (在这种情况下,当按下ALT时,"植物"植物"中有下划线。)

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

我知道我可以通过getInputMapgetActionMap指定自定义键绑定来自行完成此操作,但是否有办法更改应用程序全局助记符修饰符以便我们可以使用自动键绑定和触发字符突出显示? (就我而言,我想使用CommandMeta作为助记键修饰键。)

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

getFocusAcceleratorKeyMask

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

public class MyToolkit extends WToolkit {

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

您需要为类设置正确的包路径。确保在启动任何GUI相关代码之前放置此行,最好在System.setProperty("awt.toolkit", "packagename.MyToolkit"); 的第一行。现在应该将main设置为全局助记符修饰符(或者使用CONTROL,如果这是你想要的。查看META_DOWN_MASK获取MASK列表。)。