Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java KeyListener未添加_Java_Swing_Keylistener - Fatal编程技术网

Java KeyListener未添加

Java KeyListener未添加,java,swing,keylistener,Java,Swing,Keylistener,我很确定我错过了一些很简单的东西,但我就是找不到 以下是我的游戏面板类的声明: private class GamePanel extends JPanel implements KeyListener { 在其构造器中: addKeyListener(this); 同样在构造函数中: new Thread(new Runnable() { @Override public void run() {

我很确定我错过了一些很简单的东西,但我就是找不到

以下是我的
游戏面板
类的声明:

private class GamePanel extends JPanel implements KeyListener {
在其构造器中:

addKeyListener(this);
同样在构造函数中:

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    index ++;
                    index = index >= 15 ? 0 : index;
                    if (aPress) {
                        playerX --;
                    }
                    if (dPress) {
                        playerX ++;
                    }
                    repaint();
                    try {
                        Thread.sleep(25);
                    } catch (InterruptedException e) {}
                }
            }

        }).start();
在课堂上:

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("Key pressed!");
        if (e.getKeyCode() == KeyEvent.VK_A) {
            aPress = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            dPress = true;
        }
    }
    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_A) {
            aPress = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_D) {
            dPress = false;
        }
    }
最后:

JFrame f = new JFrame();
//set up f
f.add(new GamePanel());
f.setVisible(true);

我甚至在我的
keyPressed
方法中添加了
System.out.println
,但它不会打印!我缺少什么?

添加
setFocusable(true)到游戏面板构造器。

KeyListener
是个易变的情妇。注册了
KeyListener
的组件必须是可聚焦的,并且必须具有焦点才能接收关键事件

尝试添加
setFocusable(true)
requestFocusInWindow()在注册侦听器之后

一个更好的办法是使用,这将超越焦点问题

InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "a.pressed");
am.put("a.pressed", new AbstractAction() {
    public void actionPerformed(ActionEvent evt) {
        aPress = true;
    }
});

我看不到
requestFocusInWindow()
或对共享
按键的同步访问。“好吧,我明天就试试看;我现在要睡觉了,为变化无常的情妇准备+1(哦,是的,还有一点是为了提到键绑定)