复制粘贴快捷方式仅在OSX Java应用程序中使用ctrl键

我在OSX上使用Netbeans 8.1创建了一个小应用程序,执行以下步骤:

  • 我使用类别“Swing GUI forms”创建了一个新的JForm
  • 我添加了三个菜单:

在此处输入图像描述

  • 我添加了一个带文本字段的JDialog,并将其链接到第三个菜单(“TAnalyse”)。

在这个JDialog中,我需要文本字段的复制/粘贴function。 问题是:复制/粘贴只能在此对话框中使用“ctrl”+“c”,“x”或“v”,而不能使用osx标准“cmd”键。

我尝试将以下代码行添加到JForm的构造函数中,但它不起作用:

KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()); 

附加信息:我正在使用JDK7和OSX Yosemite。 外观和感觉是“Nimbus”。 另外两个菜单(“文件”,“编辑”)尚未实现。

你能给出解决方案的提示吗?

更新:我使用Netbeans GUI构建器(Swing GUI Forms – > JDialog)创建了另一个小例子。 我刚刚在JFrame中添加了一个菜单栏,并在GUI构建器中添加了一个JMenuItem。 通过以下答案的评论,我手动将一些代码添加到构造函数中:

 public NewJDialogGUI(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); AbstractAction copyAction = new DefaultEditorKit.CopyAction(); copyAction.putValue(Action.ACCELERATOR_KEY,KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK)); this.jMenuItem1.setAction(copyAction); this.jMenuItem1.setText("Copy"); this.jMenuItem1.setMnemonic(KeyEvent.VK_C); } 

结果是:

在此处输入图像描述

Update2:我使用Netbeans GUI构建器(Swing GUI Forms – > Application示例表单)创建了另一个小例子。

结果是:

在此处输入图像描述

最后,我使用Netbeans(空Java文件)创建了一个示例,其源代码稍微从下面的答案修改。

结果是:

在此处输入图像描述

Java使用Actions来封装function和密钥绑定,以响应用户键入的密钥。 在此示例中, DefaultEditorKit操作CopyAction用作菜单项的Action 。 它会将用户的选择从焦点文本组件复制到剪贴板。 使用getMenuShortcutKeyMask()获取正确的加速器,如此处所述。

图片

 import com.sun.glass.events.KeyEvent; import java.awt.EventQueue; import java.awt.Toolkit; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.text.DefaultEditorKit; /** * @see https://stackoverflow.com/a/34830519/230513 */ public class MenuTest { private static final int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); private void display() { JFrame f = new JFrame("Test"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("Edit"); menu.setMnemonic(KeyEvent.VK_E); JMenuItem menuItem = new JMenuItem(); AbstractAction copyAction = new DefaultEditorKit.CopyAction(); copyAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK)); menuItem.setAction(copyAction); menuItem.setText("Copy"); menu.add(menuItem); menuBar.add(menu); f.setJMenuBar(menuBar); f.add(new JTextField(10)); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new MenuTest()::display); } }