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

2024-04-15

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

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

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

这太棒了……嗯,有点。在 Mac 上,当用户按ALT(这也是Option在 Mac 键盘上)助记符会突出显示,但在以下情况下不会触发焦点更改:p也被压了。但是,如果用户按下Control + Option + p,然后它按“预期”工作并且焦点发生变化。 (顺便说一句,如果用户确实按下Option + p,当前聚焦的文本字段将插入有趣的字符。)

我知道我可以通过指定自定义键绑定来自己完成此操作getInputMap and getActionMap, but 有没有办法更改应用程序全局助记符修饰符这样我们就可以使用自动按键绑定并触发字符突出显示? (就我而言,我想使用Command or Meta作为助记符修饰键。)


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

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

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

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

如果第一行是null of false (see 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对于掩码列表。)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改 Java/Swing 中的助记符修饰键 的相关文章

随机推荐