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

时间:2016-01-13 13:05:09

标签: java macos keyboard-shortcuts copy-paste

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

  • 我使用类别" Swing GUI表单"创建了一个新的JForm。
  • 我添加了三个菜单:

enter image description here

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

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

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

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

其他信息: 我正在使用JDK7和OSX Yosemite。外观和感觉是" Nimbus"。另外两个菜单(" File"," Edit")尚未实现。

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

更新 我用Netbeans GUI builder(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);
    }

结果是:

enter image description here

UPDATE2: 我使用Netbeans GUI构建器(Swing GUI Forms - > Application sample form)创建了另一个小例子。

结果是:

enter image description here

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

结果是:

enter image description here

1 个答案:

答案 0 :(得分:2)

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

image

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);
    }
}