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

最佳答案

我知道这是一个老话题,但是我努力地尝试了与原始海报完全相同的事情,并找到了解决方案。 JFrame本身没有getInputMap方法,但其根 Pane 却有。因此,您必须改为使用“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);

    }
}

09-25 19:23