我有一个菜单项“rename”,F2被设置为加速器。实际上,当菜单显示时,“重命名”旁会有一个“F2”指示。
可悲的是,这不起作用。此加速器不会触发响应。当我将加速器更改为CTRL + F2时 - 它可以工作。
似乎我应该使用InpoutMpa / ActionMap。问题是我希望这在应用程序的任何地方都可以工作,所以我试图将它与顶级JFrame相关联。但是,JFrame没有getInputMap()方法。
忘记。
[补充]
ks = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);
JMenuItem mi = new JMenuItem("Rename");
mi.setAccelerator(ks);
mi.addActionListener(action);
答案 0 :(得分:5)
我知道这是一个老线程,但我与原始海报完全相同,并找到了解决方案。 JFrame本身没有getInputMap方法,但它的根窗格却有。所以你必须使用“getRootPane.getInputMap”。
示例代码:
public class ApplicationFrame extends JFrame {
private AbstractAction f2Action = new AbstractAction() {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) {
// Do something useful
}
};
public ApplicationFrame() {
InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = getRootPane().getActionMap();
inputMap.put(KeyStroke.getKeyStroke("F2"), "f2Action");
actionMap.put("f2Action", f2Action);
}
}
答案 1 :(得分:4)
这可能正在发生,因为JTable使用F2来调用StartEditing操作(我在其中一个程序上看到了相同的行为并将其追溯到此)。
有几种解决方案。最激烈的是删除这个输入映射(我相信这段代码实际上删除了所有JTable的映射):
KeyStroke keyToRemove = KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0);
InputMap imap = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
while (imap != null)
{
imap.remove(keyToRemove);
imap = imap.getParent();
}
或者,如果您仅使用该表进行显示,并且不打算让用户对其进行编辑,则可以使其不可聚焦:
table.setFocusable(false);
在一个完全不同的主题上,我强烈建议为您的菜单项创建一个AbstractAction
子类,而不是“从头开始”创建它们。除了为您提供非常简单的菜单设置代码外,您还可以对主菜单和弹出/工具栏使用相同的操作实例,并同时启用/禁用它们。