1つの可能性は、METAキーイベントをCTRLキーイベントに変換することです。そのため、OS XのユーザーがMETAキーを押すと、代わりにCTRLキーに変換されます。これは、LAF間でCTRLとMETAのみが交換されているキーショートカットに対して正しく機能するはずです。より複雑な他のコンボがある場合は、常により複雑なマッチングと変換を行うことができます。基本的な変換を行うためのコードは以下のとおりです。CTRL+Oのキーアクセラレータを使用してJMenuItemでテストしたので、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);
これにより、AWTEventListenerがAWTEventキューにインストールされ、すべての主要なイベントに影響します。