Java AWT键侦听器反应缓慢

Java AWT键侦听器反应缓慢,java,swing,awt,keylistener,Java,Swing,Awt,Keylistener,我正在用JavaSwing创建一个简单的游戏。我有一个问题,keylister的反应似乎有点起伏/缓慢。角色使用以下代码移动: // player control public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch(key){ case(KeyEvent.VK_LEFT): dx = -speed; break; case(KeyEven

我正在用JavaSwing创建一个简单的游戏。我有一个问题,
keylister
的反应似乎有点起伏/缓慢。角色使用以下代码移动:

// player control
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        switch(key){
        case(KeyEvent.VK_LEFT): dx = -speed; break;
        case(KeyEvent.VK_RIGHT): dx = speed; break;
        case(KeyEvent.VK_UP): dy = -speed; break;
        case(KeyEvent.VK_DOWN): dy = speed; break;
        }
    }

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    switch(key){
    case(KeyEvent.VK_LEFT): dx = 0; break;
    case(KeyEvent.VK_RIGHT): dx = 0; break;
    case(KeyEvent.VK_UP): dy = 0; break;
    case(KeyEvent.VK_DOWN): dy = 0; break;
    }
}

// this method is performed each time before redrawing the screen
public void step() {
    x += dx;
    y += dy;
}

大多数情况下,一切都很好,但有时角色在对键盘做出反应之前会停止一段时间。如何让键盘输入更流畅?

谢谢大家的回答!他们帮助我走上了正确的道路

正如我在评论中所说,这里发生的事情如下: 例如,如果我们按住右键-角色向右移动,然后按左键,它开始向左移动。现在,如果我们释放右键,xSpeed将重置为零,
keylister
必须等待再次触发
keyPressed()
,因为我们仍然按住左键。“按键重复速度”默认设置,据我所知无法调整

因此,解决方案是跟踪当前按下的键,这样我们就不必在释放右键时将角色的速度降为零,如果我们仍然按住左键

抱歉,这里有一个有点晦涩的示例,只是试图保持代码的小型化:

// Define keys: up, right, down, left
// 0 - not pressed, 1 - pressed
private int[] keys = {0, 0, 0, 0};

// player control
public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    // we set the corresponding 'key indicator' to 1 when it is pressed
    switch(key){
        case(KeyEvent.VK_LEFT): dx = -speed; keys[3] = 1; break; 
        case(KeyEvent.VK_RIGHT): dx = speed; keys[1] = 1; break;
        case(KeyEvent.VK_UP): dy = -speed; keys[0] = 1; break;
        case(KeyEvent.VK_DOWN): dy = speed; keys[2] = 1; break;
        case(KeyEvent.VK_SPACE): fireOn = true; break;
    }
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    // now before resetting the speed we check if the opposite key
    // is still pressed
    switch(key){
        case(KeyEvent.VK_LEFT): if(keys[1]==0){dx = 0;} keys[3] = 0; break;
        case(KeyEvent.VK_RIGHT): if(keys[3]==0){dx = 0;} keys[1] = 0; break;
        case(KeyEvent.VK_UP): if(keys[2]==0){dy = 0;} keys[0] = 0; break;
        case(KeyEvent.VK_DOWN): if(keys[0]==0){dy = 0;} keys[2] = 0; break;
        case(KeyEvent.VK_SPACE): fireOn = false; break;
    }
}
另一种方法可能有助于:

object.addKeyListener(new KeyAdapter() {
    @Override
    public void keyTyped(KeyEvent e) {
        updateOpreation();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        updateOpreation();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        updateOpreation();
    }

}

可能是“关键重复速度”。您是否考虑过使用键绑定?这根本不是真的,反应慢???,当然有一个问题==取决于您的代码。。。。(使用
KeyBinding
)也是一样),为了更好地帮助您更快地编辑您的问题,在阅读了有关键绑定的内容后,它们的工作方式似乎与
keylister
的工作方式相同,我还想知道是否可以在触发按键事件后“退出”按键事件,因此,它不会重复从键盘到
键侦听器的正确输出
键绑定
相同,但这里的相似性已经结束,接下来的一切都是关于
聚焦
聚焦子系统
,与
键绑定
无关,你永远无法解决这个问题,使用
KeyListener
是最重要、最主要的问题,取决于…,最多,您可以使用SSCCE编辑您的帖子,以获得更好的帮助通过鼠标查看帖子单击“使用Swing Timer延迟任何监听器的事件没有问题”,您现在可以看到差异吗???为什么需要此帮助?