【问题标题】:Java Swing InputEvent modifiers for various hardware适用于各种硬件的 Java Swing InputEvent 修饰符
【发布时间】:2019-06-16 21:53:31
【问题描述】:

我在 Java Swing 界面InputEvent 中寻找(硬件)修饰键及其与掩码的映射列表。作为 Java 7,我知道有五个掩码:

  • SHIFT_DOWN_MASK
  • CTRL_DOWN_MASK
  • META_DOWN_MASK
  • ALT_DOWN_MASK
  • ALT_GRAPH_DOWN_MASK
    • 请参阅:wiki。

如果我遗漏任何内容,请引起我的注意。

From this Eclipse bug report about SWT,我学会了:

  • Apple 机器往往有四个键:command、option、shift 和control。
  • PC 风格的机器往往有五个键(现在):control、alt、shift、win, 和 菜单。
    • 对于本次讨论,我不认为 menu 键是修饰符。 (再次:如果错了,请纠正我。)
    • 但是,win 键可以组合使用,例如,Win+E 为 Windows 资源管理器打开一个新窗口。李>

我意识到“PC”和“Apple”之间的界限在过去几年中已经模糊。可能会有带有大量修饰符的键盘。

我的问题:

  1. Apple command 和 option 键如何映射到 InputEvent 掩码?
  2. PC win 键如何映射到InputEvent 掩码?

【问题讨论】:

  • AWTEventListener 以整数形式返回所有键和鼠标事件,必须先测试是否在 Swing API 中实现的 KeyBindings 以消耗()这些事件,然后这些事件不再可用于 AWTEventListener、KeyListener 等所有事件取决于 Key Event 是否与 MosueEvent 一起使用,那么 Java7 API 中存在一些错误(与 Java6 相比),永远不需要以某种方式解决,只知道文档和事件之间存在错误... .
  • This (admittedly old) Apple page 说 Java 的 Meta 相当于 Mac 的 Command 键,而 Java 的 Alt 相当于 Option 键。

标签: java swing keyboard-shortcuts


【解决方案1】:

“快捷方式”或“加速器”键可以跨平台方式轻松处理 在 Swing 中。

工具包提供了本机操作系统快捷键的键 ID:

int shortcut = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask();

这样你就可以做一个KeyStroke

    int key = KeyEvent.VK_Q; // or whatever
    KeyStroke ks = KeyStroke.getKeyStroke( key, shortcut );

getMenuShortcutKeyMask 方法是正确的、跨平台的、Sun 支持的方法,可以为当前平台的菜单加速器(AKA 快捷方式)获取适当的修饰符掩码。它使用当前平台的适当 java.awt.event.InputEvent 常量返回一个修饰符掩码——在 OS X 上这是 InputEvent.META_MASK,在 Windows 上是 InputEvent.CTRL_MASK。使用这些文字而不是调用 getMenuShortcutKeyMask 是不好的形式,尽管它可以工作。

另外需要注意的是,您可以在加速键击中使用修饰符组合:

KeyStroke ks = KeyStroke.getKeyStroke( KeyEvent.VK_P, shortcut | InputEvent.SHIFT_MASK );

创建 Command+Shift+P 击键(在 OS X 上,Control+Shift+P 在 Windows 上)。这允许您使用标准菜单项(例如使用 Command+P 的打印)使用的助记键创建加速键击,而不会与标准击键冲突。

Windows键情况下:

// Invoked when a key has been pressed.
public void keyPressed(KeyEvent e) {
    // Returns the integer code for the key on the keyboard and if
    // keyCode is equal to VK_WINDOWS)...
    if (e.getKeyCode() == KeyEvent.VK_WINDOWS) {
        // ...call the doIT method.
        doIT();
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多