使用Nimbus LAF的Mac键盘快捷键

有没有办法在OS X上使用Nimbus LAF(外观和感觉),同时仍然可以使用Meta键进行剪切/复制/粘贴和选择所有操作?

我目前在我的Swing应用程序的main方法中有以下代码,它根据操作系统更改了LAF(OS X的默认值,所有其他的Nimbus):

if (!System.getProperty("os.name", "").startsWith("Mac OS X")) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(LicenseInspectorUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } } 

我这样做是一种解决方法,因为Nimbus会覆盖OS X上的剪切/复制/粘贴和select-all的键盘快捷键( Meta键与Ctrl键)。 如果只是键盘快捷键没有被覆盖,我宁愿一直使用Nimbus。

使用getMenuShortcutKeyMask()方法与NimbusLookAndFeel一起使用以启用键,如本例所示。 另见相关答案 。

JTextField的特定情况下,您可以在引发原始操作的键绑定中使用掩码。

 int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); JTextField jtf = new JTextField("Test"); jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, MASK), "select-all"); jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK), "copy"); jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_X, MASK), "cut"); jtf.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_V, MASK), "paste"); 

不同的组件使用不同的键,因此要映射所有键,您必须定义不同的键。 例如(从这里找到的基础):

 private void addOSXKeyStrokes(InputMap inputMap) { inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), DefaultEditorKit.copyAction); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.META_DOWN_MASK), DefaultEditorKit.cutAction); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.META_DOWN_MASK), DefaultEditorKit.pasteAction); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), DefaultEditorKit.selectAllAction); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), "copy"); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.META_DOWN_MASK), "selectAll"); } 

然后可以将其映射到不同的组件,如下所示:

 // This must be performed immediately after the LaF has been set if (System.getProperty("os.name", "").startsWith("Mac OS X")) { // Ensure OSX key bindings are used for copy, paste etc // Use the Nimbus keys and ensure this occurs before any component creation addOSXKeyStrokes((InputMap) UIManager.get("EditorPane.focusInputMap")); addOSXKeyStrokes((InputMap) UIManager.get("FormattedTextField.focusInputMap")); addOSXKeyStrokes((InputMap) UIManager.get("PasswordField.focusInputMap")); addOSXKeyStrokes((InputMap) UIManager.get("TextField.focusInputMap")); addOSXKeyStrokes((InputMap) UIManager.get("TextPane.focusInputMap")); addOSXKeyStrokes((InputMap) UIManager.get("TextArea.focusInputMap")); addOSXKeyStrokes((InputMap) UIManager.get("Table.ancestorInputMap")); addOSXKeyStrokes((InputMap) UIManager.get("Tree.focusInputMap")); } 

此处列出了Aqua(OS X外观和感觉)动作名称的完整列表