KeyListener won't listen on JPanel

强颜欢笑 提交于 2019-12-12 04:55:48

问题


It's a very simple program, but for some reason when I debug it and set breakpoints at the keyPressed, keyReleased and keyTyped method, the program never stops there.

    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

        }
    };

Here I add it to a JPanel, which is the exact size of the frame and the only object on it:

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

回答1:


Your problem is laying in focused element. I think that your panel lost the focus.

Note: To fire keyboard events, a component must have the keyboard focus. It can be solved in many ways for your example you can use KeyboardFocusManager for example like this:

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

Also try to use Key Bindings http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html




回答2:


Hi this should work for you.

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

}
}


来源:https://stackoverflow.com/questions/24752162/keylistener-wont-listen-on-jpanel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!