Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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 addKeyListener()不';我不为JPanel工作_Java_Swing_Jpanel_Keylistener - Fatal编程技术网

Java addKeyListener()不';我不为JPanel工作

Java addKeyListener()不';我不为JPanel工作,java,swing,jpanel,keylistener,Java,Swing,Jpanel,Keylistener,我正在尝试制作一个游戏引擎。我已经创建了Game类,但错误存在于KeyBoard类中。这里我留下一些代码 类::游戏 package transfer2pc.co.cc.game.tileengine; 导入java.awt.Graphics; 导入java.util.HashMap; 导入javax.swing.JPanel; 导入transfer2pc.co.cc.game.tileengine.input.KeyBoard; 公共抽象类游戏扩展JPanel实现Runnable{ /** *

我正在尝试制作一个游戏引擎。我已经创建了Game类,但错误存在于KeyBoard类中。这里我留下一些代码

类::游戏

package transfer2pc.co.cc.game.tileengine;
导入java.awt.Graphics;
导入java.util.HashMap;
导入javax.swing.JPanel;
导入transfer2pc.co.cc.game.tileengine.input.KeyBoard;
公共抽象类游戏扩展JPanel实现Runnable{
/**
* 
*/
私有静态最终长serialVersionUID=640206679500196209L;
HashMap-maps=null;
键盘=空;
公共游戏(){
超级();
键盘=新键盘(此);
设置键盘(键盘);
螺纹th=新螺纹(此);
th.start();
}
公开募捐{
while(true){
重新油漆();
试一试{
睡眠(30);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
@凌驾
公共空间涂料(图g){
}
公共void addMap(){
}
公共void setMap(){
}
按下公共摘要无效键(整数代码);
已发布的公开摘要(内部代码);
公共摘要void键类型(int代码);
公用键盘(键盘键){
addKeyListener(键);
}
}
类::键盘

package transfer2pc.co.cc.game.tileengine.input;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import transfer2pc.co.cc.game.tileengine.Game;

public class KeyBoard extends KeyAdapter implements KeyListener {

    Game game = null;

    public KeyBoard(Game gm){
        this.game = gm;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("KeyPressed");
        game.keyPressed(e.getKeyCode());
    }

    @Override
    public void keyReleased(KeyEvent e) {
        game.keyReleased(e.getKeyCode());
    }

    @Override
    public void keyTyped(KeyEvent e) {
        game.keyTyped(e.getKeyCode());
    }

    public static char getChar(int key){
        return (char)key;
    }

}
类::键测试

package transfer2pc.co.cc.game.tileengine.test;

import java.awt.Graphics;

import javax.swing.JFrame;

import transfer2pc.co.cc.game.tileengine.Game;
import transfer2pc.co.cc.game.tileengine.input.KeyBoard;

public class KeyTest extends Game {

    /**
     * 
     */
    private static final long serialVersionUID = 8557676950779023327L;

    char pressed;

    public KeyTest(){
        super();
        addKeyListener(new KeyBoard(this));
    }

    @Override
    public void keyPressed(int code) {
        pressed = KeyBoard.getChar(code);
    }


    @Override
    public void keyReleased(int code) {

    }


    @Override
    public void keyTyped(int code) {

    }

    @Override
    public void paint(Graphics g){
        g.drawString("You pressed: "+pressed, 20, 20);
    }

    public static void main(String[] args){
        JFrame frame = new JFrame("KeyTest");
        frame.setSize(640, 480);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.add(new KeyTest());
        frame.setVisible(true);
    }

}

但是错误是没有引发异常,并且没有读取输入。谁能告诉我做这件事的正确方法吗?

简单地说,你的面板需要对焦。无论在何处创建配电盘,都可以添加:

panel.setFocusable(true);
panel.requestFocusInWindow();
这里有一个问题(我建议以后用其中一个提问):


另外,

您可以将密钥侦听器添加到JFrame,这是我过去做过的事情。
但是,如果JFrame中有其他组件,这可能不是一个好主意。

1)要更快获得更好的帮助,请发布一个。2) 组件在可以侦听关键事件之前需要具有焦点。3) 如果面板包含树或表之类的内容,则这些组件将使用关键事件。4) 通常建议在
KeyListener
上使用键绑定。5)
Thread.sleep(30)不要这样做。在过去的两天里,我肯定已经讨论过三次了。搜索我的帖子和评论,寻找原因。我的框架中没有任何组件,但JPanel适合我,因为它们可以在小程序中使用。我相信你也可以将其添加到Applet/JApplet中,但我理解为什么你希望将代码保留在JPanel中“你能说什么是SSCE”我可以,但是我已经说过很多次了,最后我把它放到了一个网页上。此线程中已链接了两次同一网页。按照文档的链接进行操作。通读一遍。询问是否有不清楚的地方。
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SimpleKeyTest {

    public static void main(String[] args) {

        Runnable r = new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                JPanel panel = new JPanel();

                frame.getContentPane().add(panel);

                panel.addKeyListener(new KeyListener() {

                    @Override
                    public void keyTyped(KeyEvent e) {}

                    @Override
                    public void keyReleased(KeyEvent e) {}

                    @Override
                    public void keyPressed(KeyEvent e) {
                        System.out.println("Pressed " + e.getKeyChar());
                    }
                });

                panel.setFocusable(true);
                panel.requestFocusInWindow();

                frame.setSize(new Dimension(300, 300));
                frame.setVisible(true);
            }

        };

        SwingUtilities.invokeLater(r);

    }
}