【发布时间】:2017-08-23 01:13:14
【问题描述】:
我对我的 Swing UI 有一个简单的愿望:有一个标准的 Copy 操作映射到组件的 InputMap。接下来在同一个组件中有一个弹出菜单,我想添加一个菜单项来运行复制操作,当然会显示 inputMap 中的键盘快捷键。
这是映射的 mac 版本,在this 的帮助下,我终于设法将其添加为通用规则,因为我意识到某些组件使用“复制”,而其他组件使用 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");
现在,我使用 Action 创建 MenuItem:
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));
键盘快捷键自动工作听起来很有趣(我只需要弄清楚如何使 Cmd 键在 Mac 中工作而不是 Ctrl (只花了几个小时)),现在我无法链接菜单项绝不会影响现有的操作(即使再工作几个小时后)。
【问题讨论】:
-
请参阅What is the JTable CTRL+C event's name? 了解一些替代方案。
-
嗯,似乎 myTable.getInputMap().get(KeyStroke.getKeyStroke(KeyEvent.VK_C, MASK)) 给出了“null”。但是“copy”是 actionMap 中的名称,并且 actionMap.get("copy") 给出了一个有效的 Action。
-
你忘了
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT。 -
啊哈 - 不,我没有忘记 - 我不知道 :) 我承认,这是我第一次做相关的事情,所以我很挣扎,但我也没有期待任何如此复杂的事情......好吧,现在我从 InputMap 得到“复制”,正如预期的那样。 - 问题仍然存在:如何从代码或菜单条目触发该操作,以便它也可以与鼠标操作一起使用?
-
你可以试试上面引用的@camickr 的方法。