Java JFrame没有接收输入

时间:2015-09-26 22:10:22

标签: java swing

我有一个JFrame设置,在运行时添加了一个keyListener,但是当帧加载时,会有一个短暂的时刻接收输入,然后它就会停止接收所有输入,这里是{{ 1}}代码:

Keyboard.java

这是package uk.connorwright.rain.input; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class Keyboard implements KeyListener { private boolean[] keys = new boolean[120]; public boolean up, down, left, right; public void update() { up = keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W]; down = keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S]; left = keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A]; right = keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D]; } public void keyPressed(KeyEvent e) { keys[e.getKeyCode()] = true; } public void keyReleased(KeyEvent e) { keys[e.getKeyCode()] = false; } public void keyTyped(KeyEvent e) { } } 中与键盘输入相关的代码:

Game.java

...      

private Keyboard key;

....

        public void update(){
             key.update();

key = new Keyboard();

    frame.addKeyListener(key);

...

    if (key.up) {
        y--;
    }

    if (key.down) {
        y++;
    }

    if (key.left) {
        x--;
    }

    if (key.right) {
        x++;
    }
}

2 个答案:

答案 0 :(得分:2)

KeyListener是一个糟糕的选择,它负责在组件可聚焦且有焦点时为组件生成事件。

相反,您应该考虑使用Key Bindings API,它为您提供了决定应该在哪个焦点级别生成关键事件的方法

有关详细信息,请参阅How to Use Key Bindings

答案 1 :(得分:1)

我还没有对此进行测试,但我认为您的KeyListener可能需要一个具有键盘焦点的组件,而JFrame永远不会有这样的组件。只有框架的子组件才会有焦点。

从教程中: https://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html

  

具体而言,组件使用键盘触发键事件   用户按下或释放键盘键时进行对焦。详细说明   有关焦点的信息,请参阅如何使用焦点子系统。

如果你没有焦点,那么没有关键事件。