这是一个非常简单的程序,但是由于某些原因,当我调试它并在keyPressedkeyReleasedkeyTyped方法中设置断点时,该程序永远不会在那里停止。

    mainKeyListener = new KeyListener() {

        public void keyPressed(KeyEvent e) {
                System.out.println("KEY PRESSED");
                repaint();
            }
        }

        @Override
        public void keyReleased(KeyEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void keyTyped(KeyEvent arg0) {
            // TODO Auto-generated method stub

        }
    };


在这里,我将其添加到JPanel,它是框架和框架上唯一对象的确切大小:

    JPanel backgroundPanel = new JPanel();
    backgroundPanel.setBounds(0,0, 400, 500);
    backgroundPanel.addKeyListener(mainKeyListener);
    backgroundPanel.setFocusable(true);
    getContentPane().add(backgroundPanel);

最佳答案

您的问题在于关注的要素。我认为您的小组失去了焦点。

注意:
要触发键盘事件,组件必须具有键盘焦点。对于您的示例,可以通过多种方式解决此问题,您可以使用KeyboardFocusManager这样的示例:

KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        focusManager.addKeyEventDispatcher(new KeyEventDispatcher() {

            public boolean dispatchKeyEvent(KeyEvent e) {
                if(focusManager.getFocusOwner()!=backgroundPanel){
                                focusManager.redispatchEvent(backgroundPanel,e);
                                return true;}
                else return false;
            }
        });


也尝试使用键绑定http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

10-04 10:02