KeyListener不会听JPanel

时间:2014-07-15 07:18:49

标签: java swing jpanel keylistener

这是一个非常简单的程序,但由于某些原因,当我调试它并在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);

2 个答案:

答案 0 :(得分:3)

你的问题在于聚焦元素。我认为你的小组失去了重点。

注意: 要触发键盘事件,组件必须具有键盘焦点。它可以通过多种方式解决您的示例,您可以使用 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

答案 1 :(得分:0)

嗨这应该适合你。

public class Gui extends JFrame
{


private JPanel backgroundPanel = new JPanel();

public Gui() throws HeadlessException
{
    this.setLayout(new GridLayout(1,1));
    setPanelProps();
    backgroundPanel.addKeyListener(createListener());
    this.add(backgroundPanel);
    this.setVisible(true);
    this.setSize(new Dimension(400,500));
}

public void setPanelProps(){
    backgroundPanel.setBounds(0, 0, 400, 500);
    backgroundPanel.setSize(new Dimension(400,500));
    backgroundPanel.setFocusable(true);
    backgroundPanel.setBackground(new Color(50,60,70));
}


public KeyListener createListener(){
    return new KeyListener() {

        @Override
        public void keyTyped(KeyEvent e)
        {
            System.out.println("KEY TYPED");
        }

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

        @Override
        public void keyReleased(KeyEvent e)
        {
            System.out.println("KEY RELEASED");
        }

    };

}
}


public class GuiRun
{
public static void main(String[] args)
{
    Gui gui = new Gui();

}
}