我对Swing UI有一个简单的愿望:映射到组件的InputMap
的标准复制操作。接下来在这个相同的组件中有一个弹出菜单,我想添加一个运行复制操作的菜单项,当然会显示inputMap中的键盘快捷键。如何将标准复制操作映射到Swing中的弹出菜单中
这是映射,我终于成功地添加为的this帮助一个通用的规则,通过认识到某些组件使用“复制”的MAC版本,而其他人使用DefaultEditorKit.copyAction:
现在inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), DefaultEditorKit.copyAction);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.META_DOWN_MASK), "copy");
,我可以找到
ActionMap actionMap = myTable.getActionMap();
Action action = actionMap.get("copy");
一个表的动作,比如现在,我用行动来创建菜单项:
JPopupMenu popupMenu = new JPopupMenu();
JMenuItem item = new JMenuItem(action);
popupMenu.add(item);
table.setComponentPopupMenu(popupMenu);
因此,我看到菜单项,但它不会复制任何内容,尽管映射到相同操作的快捷键不会复制。我甚至可以定义快捷键(我似乎必须定义自己,但也只是作为一个用户,这些东西有某种联系在一起的暗示):
int MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK);
item.setAccelerator(keyStroke);
所以,我缺少什么?我甚至想专门定义的动作侦听器,但无济于事:
item.addActionListener(myTable.getActionForKeyStroke(keyStroke));
听起来很可笑的是,键盘快捷方式自动工作(我必须弄清楚如何使苹果代替Ctrl键的加利福尼亚 - 重点工作(只花了几个小时)),现在我不能让菜单条目与现有的动作无关(即使工作了几个小时)。
参见[*什么是JTable中CTRL + C事件的名字?*](https://stackoverflow.com/q/14356859/230513)的一些替代品。 – trashgod
嗯,似乎myTable.getInputMap()。get(KeyStroke.getKeyStroke(KeyEvent.VK_C,MASK))给出'null'。但“copy”是actionMap中的名称,而actionMap.get(“copy”)会提供有效的Action。 –
您忘记了'WHEN_ANCESTOR_OF_FOCUSED_COMPONENT'。 – trashgod