一种可能性是将 META 键事件转换为 CTRL 键事件。因此,当 OS X 上的用户按下 META 键时,它会被转换为 CTRL 键。这应该适用于只有 CTRL 和 META 在 LAF 之间交换的快捷键。如果还有其他更复杂的组合,您总是可以进行更复杂的匹配和翻译。下面是做基本翻译的代码,我用一个 JMenuItem 测试了它,它的快捷键是 CTRL+O,所以现在 META+O 激活了加速器。
java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
public void eventDispatched(AWTEvent event) {
KeyEvent kev = (KeyEvent) event;
if (kev.getID() == KeyEvent.KEY_PRESSED || kev.getID() == KeyEvent.KEY_RELEASED || kev.getID() == KeyEvent.KEY_PRESSED) {
if ((kev.getModifiersEx() & KeyEvent.META_DOWN_MASK) != 0 && !((kev.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0)) {
kev.consume(); // Drop the original event, this is really optional.
KeyEvent fake = new KeyEvent(kev.getComponent(),
kev.getID(),
kev.getWhen(),
(kev.getModifiersEx() & ~KeyEvent.META_DOWN_MASK) | KeyEvent.CTRL_DOWN_MASK,
kev.getKeyCode(), kev.getKeyChar());
java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(fake);
}
}
}
}, KeyEvent.KEY_EVENT_MASK);
这会在 AWTEvent 队列上安装一个 AWTEventListener,并将影响所有关键事件。