Timer 计时器运行时无法使keyListener工作

Timer 计时器运行时无法使keyListener工作,timer,keylistener,Timer,Keylistener,大家好,stack overflow的人,我的程序有一个驱动程序类Frogger,一个JPanel类,它计算所有内容,将所有必要的面板集合在一起,并实现名为FroggerPanel的keyListener,还有一个JPanel类,它根据FroggerPanel中的元素绘制所有内容,名为FroggerDisplayPanel 这是一个包含完整代码的粘贴箱: 当计时器没有启动时,keyListener会正常工作,但一旦启动,它就根本不会响应 这就是在Frogger类中添加并重点关注keyListen

大家好,stack overflow的人,我的程序有一个驱动程序类Frogger,一个JPanel类,它计算所有内容,将所有必要的面板集合在一起,并实现名为FroggerPanel的keyListener,还有一个JPanel类,它根据FroggerPanel中的元素绘制所有内容,名为FroggerDisplayPanel

这是一个包含完整代码的粘贴箱:

当计时器没有启动时,keyListener会正常工作,但一旦启动,它就根本不会响应

这就是在Frogger类中添加并重点关注keyListener的地方:

public static void main(String[]args) throws IOException
{
    frame = new JFrame("CS125 Frogger");
    Frogger startPanel = new Frogger();
    FroggerPanel panel = new FroggerPanel();

    frame.addKeyListener(panel);
    frame.setFocusable(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(panel);
    frame.pack();
    frame.setVisible(true);
}
这是FroggerPanel中的stepGame方法,当计时器延迟到期时调用,它主要涉及移动所有车辆;setLocations方法中的青蛙矩形是我响应keyListener所需的:

    private int current_x_step = 0;
private int lane_bounds = 0;
private int new_pos = 0;
private void stepGame() {

    for (int i = 0; i < laneAmt; i++) {
        if(i == 0 || i % 2 == 0){
            current_x_step = X_STEP_SIZE;
            lane_bounds = display.getWidth()+rUnit;
            new_pos = -rUnit;
        }else if((i-1) == 0 || (i-1) % 2 == 0){
            current_x_step = -X_STEP_SIZE;
            lane_bounds = -rUnit;
            new_pos = DISPLAY_DIM + rUnit;
        }

        for(int j = 0; j < cars.get(i).size(); j++){
            cars.get(i).get(j).x += current_x_step;                     
            if (cars.get(i).get(j).x == lane_bounds) {                      
                cars.get(i).get(j).x = new_pos;             
            }
            if(cars.get(i).get(j).intersects(Frog)){
                timer.stop();
                startPause.setText("Retry?");
                break;
            } 
        }
    }           
    display.setLocations(cars, Frog);   
    if(Frog.y == 0){
        stepLevel();            
    }
}
任何建议都将不胜感激,谢谢您的帮助

public void keyPressed(KeyEvent e) {
    switch(e.getKeyCode()){
    case KeyEvent.VK_W: Frog.y -= rUnit; break;
    case KeyEvent.VK_S: Frog.y += rUnit; break;
    case KeyEvent.VK_A: Frog.x -= rUnit; break;
    case KeyEvent.VK_D: Frog.x += rUnit; break;         
    }
    display.setLocations(cars, Frog);
}

@Override
public void keyReleased(KeyEvent e) {

}

@Override
public void keyTyped(KeyEvent e) {
    switch(e.getKeyCode()){
    case KeyEvent.VK_W: Frog.y -= rUnit; break;
    case KeyEvent.VK_S: Frog.y += rUnit; break;
    case KeyEvent.VK_A: Frog.x -= rUnit; break;
    case KeyEvent.VK_D: Frog.x += rUnit; break;             
    }   
    display.setLocations(cars, Frog);
}