java swing在释放一个键时禁用多个按键

java swing在释放一个键时禁用多个按键,java,swing,keylistener,Java,Swing,Keylistener,我有一辆车,看起来像一个可以发射子弹的盒子。如果我按下或按住2或3个键,它们都会工作,但只要我松开1个键,其他所有的一切都会停止,就好像所有的键都松开了一样。但是,如果我再次按任意键或按住任意键,所有仍按住的键将重新开始工作 我搜索并发现了一个与我的问题完全相同的问题,在我的案例moveCar方法中通过循环run方法解决了这个问题,但我不确定run方法如何在这里循环 我现在刚开始学习java,只是在学习swing一章时做了一些练习,并没有把游戏或任何事情做得很认真,所以我只想知道这不起作用的原因

我有一辆车,看起来像一个可以发射子弹的盒子。如果我按下或按住2或3个键,它们都会工作,但只要我松开1个键,其他所有的一切都会停止,就好像所有的键都松开了一样。但是,如果我再次按任意键或按住任意键,所有仍按住的键将重新开始工作

我搜索并发现了一个与我的问题完全相同的问题,在我的案例moveCar方法中通过循环run方法解决了这个问题,但我不确定run方法如何在这里循环

我现在刚开始学习java,只是在学习swing一章时做了一些练习,并没有把游戏或任何事情做得很认真,所以我只想知道这不起作用的原因以及如何使它起作用

public class MovingObject extends JFrame {
private BoxCar boxCar = new BoxCar();
private final int NUMKEYS = 5;

private boolean [] keys = new boolean [NUMKEYS];

public MovingObject() {
    add(boxCar);

    boxCar.addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent e) {
            switch(e.getKeyCode()) {
                case KeyEvent.VK_LEFT: 
                    keys[0] = true;
                    break;

                case KeyEvent.VK_RIGHT: 
                    keys[1] = true;
                    break;

                case KeyEvent.VK_UP:
                    keys[2] = true;
                    break;

                case KeyEvent.VK_DOWN:
                    keys[3] = true;
                    break;

                case KeyEvent.VK_A: 
                    keys[4] = true;
                    break;
            }
            moveCar();
        }

        public void keyReleased(KeyEvent e) {
            switch(e.getKeyCode()) {
                case KeyEvent.VK_LEFT: 
                    keys[0] = false;
                    break;

                case KeyEvent.VK_RIGHT: 
                    keys[1] = false;
                    break;

                case KeyEvent.VK_UP:
                    keys[2] = false;
                    break;

                case KeyEvent.VK_DOWN:
                    keys[3] = false;
                    break;

                case KeyEvent.VK_A: 
                    keys[4] = false;
                    break;
            }
            moveCar();
        }
    });
    boxCar.setFocusable(true);
}

private void moveCar() {
    if(keys[0]) { 
        if(boxCar.getXCoordinate() > 20)
            boxCar.setXCoordinate(boxCar.getXCoordinate() - 20); 
    }

    if(keys[1]) { 
        if(boxCar.getXCoordinate() < (boxCar.getWidth() - boxCar.getCarWidth() - 20))
            boxCar.setXCoordinate(boxCar.getXCoordinate() + 20); 
    }

    if(keys[2]) {
        if(boxCar.getYCoordinate() > 20)
            boxCar.setYCoordinate(boxCar.getYCoordinate() - 20);
    }

    if(keys[3]) {
        if(boxCar.getYCoordinate() < (boxCar.getHeight() - boxCar.getCarHeight() - boxCar.getTireDiameter() - 20))
            boxCar.setYCoordinate(boxCar.getYCoordinate() + 20);
    }

    if(keys[4]) {   
        boxCar.setBullet();
        boxCar.setGun(true);
        Timer timer = new Timer(100, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(boxCar.bulletDistanceTravel() > boxCar.getWidth()) {
                    boxCar.setGun(false);
                }
                boxCar.repaint();
            }
        });
        timer.start();
    }       
}

另一个问题是有时子弹以恒定的速度移动,但大多数情况下,子弹的速度在每次射击时都会加倍?

对于第二个问题,您应该使用一个计时器,而不是在每次键[4]为真时启动新的计时器,因为它们会累积……欢迎使用堆栈溢出!考虑提供一个演示你的问题,这将减少猜测工作,并产生更好的响应哦抱歉,但看起来很长的原因这4个案件是几乎相同的事情。我只是想问一些问题,代码只是放在那里作为参考。还有,在这种情况下,我如何使用单个计时器?我有一个20颗子弹的数组,每个子弹都有单独的xcoord和ycoord,所以每次我按下A键,就会发射一颗子弹,然后启动该子弹的计时器。基本上,一个计时器会查看数组并更新那里的位置