【问题标题】:Change mnemonic modifier key in Java/Swing在 Java/Swing 中更改助记符修饰键
【发布时间】:2014-03-11 12:42:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 是的(从未尝试过)那些加速器是 - 1. TextAction 或 2 UIManager

标签: java swing user-interface mnemonics


【解决方案1】:

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

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

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

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

如果第一行是false 中的null(参见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 的MASK 列表。)。

【讨论】:

  • WToolkit 是最终版本,无法扩展。
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2012-03-08
  • 2019-08-19
相关资源
最近更新 更多