在java中处理两个按键

时间:2014-08-27 12:02:52

标签: java keypress

我的代码中存在问题,因为我不知道如何在同时按下向上箭头和向左箭头等方式使图片移动对角线。这是我的代码:

 public void keyPressed(KeyEvent ke) {
    switch (ke.getKeyCode()) {
    case KeyEvent.VK_RIGHT: {
        cordX += 5;
    }
        break;
    case KeyEvent.VK_LEFT: {
        cordX -= 5;
    }
        break;
    case KeyEvent.VK_DOWN: {
        cordY += 5;
    }
        break;
    case KeyEvent.VK_UP: {
        cordY -= 3;
    }
        break;
    }
    repaint();
}

我不知道这是否有用

case KeyEvent.VK_UP  &&  KeyEvent.VK_LEFT: {
        cordY += 5;
    }
        break;

2 个答案:

答案 0 :(得分:4)

如果您使用的是Swing组件,请使用Key Bindings API,请参阅How to Use Key Bindings,它将解决问题......

在任何情况下,解决方案(基本上)都是相同的,您需要做的是定义一系列标志,这些标志定义当前按下哪些键,并以固定间隔更新受这些标志影响的变量的状态< / p>

private boolean down, up, left, right;
//...

public void keyPressed(KeyEvent ke) {
    switch (ke.getKeyCode()) {
        case KeyEvent.VK_RIGHT:
            right = true;
            break;
        case KeyEvent.VK_LEFT:
            left = true;
            break;
        case KeyEvent.VK_DOWN:
            down = true;
            break;
        case KeyEvent.VK_UP:
            up = true;
            break;
    }
    updateState();
}

public void keyReleased(KeyEvent ke) {
    switch (ke.getKeyCode()) {
        case KeyEvent.VK_RIGHT:
            right = false;
            break;
        case KeyEvent.VK_LEFT:
            left = false;
            break;
        case KeyEvent.VK_DOWN:
            down = false;
            break;
        case KeyEvent.VK_UP:
            up = false;
            break;
    }
    updateState();
}

protected void updateState() {
    if (right) {
        cordX += 5;
    } else if (left) {
        cordX -= 5;
    }
    if (down) {
        cordY += 5;
    } else if (up) {
        cordY -= 3;
    }
    repaint();
}

然后,您可以使用javax.swing.Timer来安排定期回拨,这可以用来调用updateState(而不是从关键事件处理程序调用它)。

查看How to use Swing Timers了解更多详情......

答案 1 :(得分:0)

您可以使用Timer

public class MyClass extends KeyAdapter implements ActionListener {

    private Timer timer; //this timer will update your object's position
    private int vx = 0; //these values indicate your objects velocity
    private int vy = 0; //they are updated as your arrow keys are pressed

    public MyClass() {
        this.timer = new Timer(100 /*the delay*/, this/*the listener*/);
        //the delay indicated how frequently you want to update your position, i chose 100ms, you may chose a different number
    }

    @Override public void keyPressed(KeyEvent ke) {
        switch (ke.getKeyCode()) {
            case KeyEvent.VK_RIGHT:
                vx = 5;
            break;
            case KeyEvent.VK_LEFT:
                vx = -5;
            break;
            case KeyEvent.VK_DOWN:
                vy = 5;
            break;
            case KeyEvent.VK_UP:
                vy = -3;
            break;
        }
        this.timer.start(); //start your timer when a key is pressed (will do nothing if it's already running)
    }

    //obviously, you will need to stop your objects once the keys are released.
    @Override public void keyReleased(KeyEvent ke) {
        switch(ke.getKeyCode()) {
            case KeyEvent.VK_RIGHT:
                vx = 0;
            break;
            case KeyEvent.VK_LEFT:
                vx = 0;
            break;
            case KeyEvent.VK_DOWN:
                vy = 0;
            break;
            case KeyEvent.VK_UP:
                vy = 0;
            break;
        }
        if(vx == 0 && vy == 0) this.timer.stop(); //no need to run the timer if no key is down
    }

    //this will be called regularly by the timer
    @Override public void actionPerformed(ActionEvent ae) {
        cordX += vx; //you just update the positions
        cordY += vy; //according to your variables
        repaint(); //then repaint
    }
}

编辑:您可以对此进行优化,以避免在(例如)按下左右键时出现奇怪的行为。