Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的计时器正在加速,即使它';它只创建了一次_Java_Swing_Timer - Fatal编程技术网

java中的计时器正在加速,即使它';它只创建了一次

java中的计时器正在加速,即使它';它只创建了一次,java,swing,timer,Java,Swing,Timer,我已经看到了这个问题的其他几个答案,但所有这些帖子似乎都有我的代码没有的问题。(一个是每次调用paintComponent()方法时都会创建计时器,另一个是布尔值,始终为true,因此我认为每个循环都会创建一个计时器) 我写的基本上是一个版本的砌砖机。我希望用户在游戏重置前有5次生命。在计时器处理程序类中,我有一个由actionPerformed()调用的方法checkForOutOfBounds(),该方法减少生命数,并在球从屏幕底部掉出时将球返回其初始位置。出于某种原因,每次调用此方法后,计

我已经看到了这个问题的其他几个答案,但所有这些帖子似乎都有我的代码没有的问题。(一个是每次调用
paintComponent()
方法时都会创建计时器,另一个是布尔值,始终为true,因此我认为每个循环都会创建一个计时器)

我写的基本上是一个版本的砌砖机。我希望用户在游戏重置前有5次生命。在计时器处理程序类中,我有一个由
actionPerformed()
调用的方法
checkForOutOfBounds()
,该方法减少生命数,并在球从屏幕底部掉出时将球返回其初始位置。出于某种原因,每次调用此方法后,计时器都会开始加速,尽管在反复查看这些方法及其调用的方法后,我根本找不到计时器受到影响的地方。下面是我的项目中的相关代码。这都在
GameFrame
类中,它扩展了
JFrame
。谢谢大家!

protected int lives = 5;
protected Life Life1, Life2, Life3, Life4, Life5;
protected boolean[] livesBooleanArray;

...

protected class GameCanvas extends JPanel {
    public GameCanvas() {   
        setFocusable(true);
    }
    @Override
    public void paintComponent(Graphics g) {
        paddle.draw(g);
        ball.draw(g);
        if (livesBooleanArray[0]) {
            Life1.draw(g);
        }
        if (livesBooleanArray[1]) {
            Life2.draw(g);
        }
        if (livesBooleanArray[2]) {
            Life3.draw(g);
        }
        if (livesBooleanArray[3]) {
            Life4.draw(g);
        }
        if (livesBooleanArray[4]) {
            Life5.draw(g);
        }

    }

}

protected void setUpTimer() {
    timer = new Timer(TIMER_DELAY, new TimerHandler());
}

protected class TimerHandler implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("TimerHandler.actionPerformed()");

        ball.t += .1;
        checkForOutOfBounds();
        ball.update();
        paddle.update();
        canvas.repaint();
        System.out.println(ball.t);
    }
}

public void checkForOutOfBounds() {
    if ((ball.y_pos + ball.getHeight()) >= getHeight()) {
        int x = (int)(0.5*getHeight());
        int y = (int)(0.25*getHeight());
        ball.setLocation(x, y);
        updateLives();
    }
    else {}
}

public void updateLives() {
    lives --;
    livesBooleanArray[lives] = false;
    if (lives == 0) {
        resetScreen();
    }
}

public void resetScreen() {
    int x = (int)(0.5*getHeight());
    int y = (int)(0.25*getHeight());
    ball.setLocation(x, y);
    lives =5;
    setUpLives();
    timer.restart();
}

setUpTimer()
仅在
GameFrame
首次初始化(在main方法中)时调用,因此它不应该在任何其他点创建新计时器。

是否在
setUpTimer
中设置断点以确保只调用一次?您是否在
TimerHandler.actionPerformed
中设置了断点,并检查了
e.getSource()
是否每次都是相同的
计时器
?只有当e.getSource()是最初初始化的计时器时,当我使actionPerformed()中的所有代码都执行时,它仍然会加速。我放入一条语句来打印事件,它打印:“javax.swing上的java.awt.event.ActionEvent[unknown type,cmd=null,when=1460397513714,modifiers=]。Timer@3192c4d6“,每一次,这意味着它是同一个计时器,对吗?(每次运行计时器的地址都相同)确保在执行任何自定义绘制之前调用super.paintComponent,以防止可能出现的图形故障。要更快地获得更好的帮助,请发布或。