Java - KeyListener不起作用,但ActionListener可以

时间:2015-08-04 06:05:04

标签: java swing keylistener

单击MenuItem NewGame。它有效,但按F2不会

mntmNewGame.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            int n = JOptionPane.showConfirmDialog(contentPane,"Do you want to play new game ?", "Message!", JOptionPane.OK_CANCEL_OPTION);
        }
    });

    mntmNewGame.addKeyListener(new KeyAdapter() {
        public void keyListener(KeyEvent e) {
            if(e.getKeyCode()==KeyEvent.VK_F2)
            {
                int n = JOptionPane.showConfirmDialog(contentPane,"Do you want to play new game ?", "Message!", JOptionPane.OK_CANCEL_OPTION);
            }
        }
    });

2 个答案:

答案 0 :(得分:6)

这就是为什么在覆盖方法时应始终使用@Override ... KeyAdapter没有keyListener方法 - 它有keyPressed,{{ 1}}和keyReleased。例如,您可能需要:

keyTyped

使用mntmNewGame.addKeyListener(new KeyAdapter() { @Override public void keyTyped(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_F2) { int n = JOptionPane.showConfirmDialog( contentPane, "Do you want to play new game ?", "Message!", JOptionPane.OK_CANCEL_OPTION); // Use n, presumably... } } }); 注释,如果您输入错误,编译器会发现您尝试覆盖某些内容,但实际上并没有这样做 - 所以你得到了一个编译时错误,而不仅仅是一个从未调用的方法。

答案 1 :(得分:2)

我假设你正在使用JMenuItem的东西?在这种情况下,您应该使用JMenuItem#setAccelerator(KeyStroke)

mntmNewGame.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0));

这将触发ActionListener

有关详细信息,请参阅How to Use Menus

如果没有,那么您应该使用key bindings API而不是KeyListenerKeyListener仅在组件具有焦点且具有焦点时才会响应关键事件