java - 键盘输入处理程序不起作用

标签 java netbeans jpanel keylistener

我正在开发一个 java 项目,但我很难让键盘输入处理程序正常工作。我有两个独立的类,一类称为 KeyInput,一类称为 Player。当我启动 Player 类并按下某个键时,不会打印任何内容,但如果我在 KeyInput 类中使用 println ,它将起作用。因此,当您按下按钮时它确实会注册,只是当我想在 Player 类中使用它时它不会工作。

玩家等级:

public class Player extends JFrame {

private static final int IMAGE_TYPE = BufferedImage.TYPE_INT_ARGB;

private BufferedImage img;
KeyInput input

public Player() {
    super();
    this.add(new JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
           g.drawImage(img, 0, 0, null);
        }

    });
    img = new BufferedImage(660, 500, IMAGE_TYPE );  
    this.setSize(img.getWidth(), img.getHeight());
    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);


    input = new KeyInput(this);

    if(input.up.isPressed()){
        System.out.println("Up");
    }

    this.setVisible( true );
   }
 }

按键输入类:

public class KeyInput implements KeyListener {
    BufferedImage img = null;
    public KeyInput(Player player) {
            player.requestFocus(); // click window to move bug fix he didn't add this
            player.addKeyListener(this);
    }

    public class Key {
            private int numTimesPressed = 0;
            private boolean pressed = false;

            public int getNumTimesPressed() {
                    return numTimesPressed;
            }

            public boolean isPressed() {
                    return pressed;

            }

            public void toggle(boolean isPressed) {
                    pressed = isPressed;

                    if (isPressed) {
                            numTimesPressed++;
                    }
            }
    }

    public List<Key> keys = new ArrayList<Key>();

    public Key up = new Key();
    public Key down = new Key();
    public Key left = new Key();
    public Key right = new Key();
    public Key esc = new Key();

    public void keyPressed(KeyEvent e) {
            toggleKey(e.getKeyCode(), true);
    }

    public void keyReleased(KeyEvent e) {
            toggleKey(e.getKeyCode(), false);
    }

    public void keyTyped(KeyEvent e) {

    }

    public void toggleKey(int KeyCode, boolean isPressed) {
            if (KeyCode == KeyEvent.VK_W || KeyCode == KeyEvent.VK_UP
                            || KeyCode == KeyEvent.VK_NUMPAD8) {

                    up.toggle(isPressed);
            }
            if (KeyCode == KeyEvent.VK_S || KeyCode == KeyEvent.VK_DOWN
                            || KeyCode == KeyEvent.VK_NUMPAD2) {
                    down.toggle(isPressed);
            }
            if (KeyCode == KeyEvent.VK_A || KeyCode == KeyEvent.VK_LEFT
                            || KeyCode == KeyEvent.VK_NUMPAD4) {
                    left.toggle(isPressed);
            }
            if (KeyCode == KeyEvent.VK_D || KeyCode == KeyEvent.VK_RIGHT
                            || KeyCode == KeyEvent.VK_NUMPAD6) {
                    right.toggle(isPressed);
            }
            if(KeyCode == KeyEvent.VK_ESCAPE){
                System.exit(0);
            }
    }
 }

最佳答案

您应该使用按键绑定(bind)将击键分配给特定组件上的操作。

来自文档的引用

component.getInputMap().put(KeyStroke.getKeyStroke("F2"),
                            "doSomething");
component.getActionMap().put("doSomething",
                             anAction);
//where anAction is a javax.swing.Action

https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html#howto

关于java - 键盘输入处理程序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43126122/

相关文章:

svn - Tortoise SVN 无法与 Netbeans 11 一起使用

java - 如何多次检查特定事件?

java - 二进制 XML 文件行 #2 : Error inflating class

java - 使用 JUnit 测试 Tapestry 页面和组件

php - Netbeans 文件调试

java - Netbeans/REST 中的 POST 方法给出错误

java - GWT 2.7 启动 jetty 6?

java - Java 中 JPanel 中的自动定位组件

java - JPanel 由 textFields 组成

java - JPanel 对 KeyBindings 没有反应