我在OSX上使用Netbeans 8.1创建了一个小应用程序,执行以下步骤:
在这个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);
}
结果是:
UPDATE2: 我使用Netbeans GUI构建器(Swing GUI Forms - > Application sample form)创建了另一个小例子。
结果是:
最后,我使用Netbeans(空Java文件)创建了一个示例,源代码从下面的答案稍作修改。
结果是:
答案 0 :(得分:2)
Java使用Actions来封装功能,使用Key Bindings来响应用户键入的密钥。在此示例中,DefaultEditorKit
操作CopyAction
用作菜单项Action
。它会将用户的选择从焦点文本组件复制到剪贴板。使用getMenuShortcutKeyMask()
获取正确的加速器,如here所述。
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);
}
}