Java 使用Nimbus LAF的Mac键盘快捷键

Java 使用Nimbus LAF的Mac键盘快捷键,java,macos,swing,keyboard-shortcuts,nimbus,Java,Macos,Swing,Keyboard Shortcuts,Nimbus,有没有一种方法可以在OS X上使用Nimbus LAF(外观),同时仍然能够使用元键进行剪切/复制/粘贴并选择所有操作 我目前在Swing应用程序的主方法中有以下代码,它根据操作系统(OS X的默认值,其他所有操作系统的默认值)更改LAF: 我这样做是为了解决这个问题,因为Nimbus会覆盖OS X上剪切/复制/粘贴和全选的键盘快捷键(Meta键和Ctrl键)。如果没有覆盖键盘快捷键,我更愿意一直使用Nimbus。使用该方法与NimbusLookAndFeel一起启用⌘ 键,如图所示。另见本节相

有没有一种方法可以在OS X上使用Nimbus LAF(外观),同时仍然能够使用元键进行剪切/复制/粘贴并选择所有操作

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

我这样做是为了解决这个问题,因为Nimbus会覆盖OS X上剪切/复制/粘贴和全选的键盘快捷键(Meta键和Ctrl键)。如果没有覆盖键盘快捷键,我更愿意一直使用Nimbus。

使用该方法与
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");

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

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

// 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 Look and Feel)动作名称的完整列表是

我看不出这是如何回答这个问题的。即使在注册自定义键盘快捷键时调用getMenuShortcutKeyMask(),这也不会修复在OSX上使用NimbusLookAndFeel时默认Swing文本字段中错误的Ctrl-C、Ctrl-V等。@yonran:我已经详细阐述了上述内容。似乎每个组件的操作名称不同。因此,要映射“复制”操作,还需要映射DefaultEditorKit.copyAction。@Journiaro:不一定;这些操作已经位于文本字段的
ActionMap
,在UI委托初始化期间(按名称)放置在该字段中;看这个。对不起,我是指每种组件类型。因此,对于每个表,ActionMap都包含“复制”,而对于每个文本字段,它都包含“复制到剪贴板”(=DefaultEditorKit.copyAction),这是源链接的好消息!谢谢我花了很长时间才找到一个清晰的例子,所以我也想在这里与大家分享——我自己的补充。
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"));
}