7

我有一个菜单项“重命名”,将 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); 
4

2 回答 2

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

    }
}
于 2012-01-17T23:59:39.987 回答
5

这可能是因为 JTable 使用 F2 来调用 StartEditing 操作(我在我的一个程序上看到了相同的行为并将其跟踪到此)。

有几个解决方案。最激烈的是删除这个输入映射(我相信这段代码实际上从所有JTables中删除了映射):

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为您的菜单项创建一个子类,而不是“从头开始”创建它们。除了为您提供非常简单的菜单设置代码外,您还可以对主菜单和弹出/工具栏使用相同的操作实例,并同时启用/禁用它们。

于 2010-01-07T20:59:20.373 回答