定时器启动/停止参数

时间:2011-09-30 19:37:55

标签: java timer if-statement conditional

自加入这个社区以来,我在技能和进步方面实现了跨越式发展。你们都是一个巨大的帮助。我在给定时器时遇到了麻烦,我已经为它启动和停止时实现了某些参数。

我得到的错误是“本地变量计时器可能尚未初始化”或者我没有错误,但没有任何反应。也许我把计时器放在了错误的地方?

如果我将timer.start();放在构造函数中,一切正常,但计时器必须在程序初始化时启动。我真的希望计时器在满足某个参数之前不会启动。比方说,直到int p1Laps=1;,但如果我将timer.start();放入构造函数中的if语句(即if(p1Laps>=1) { timer.start(); },则计时器不会启动。

我尝试将timer.start();放在不同的地方,并且没有得到任何回复或因缺少局部变量timer而产生错误。

我遇到的第二个有点相关的问题是无法在没有得到上述“局部变量计时器可能尚未初始化”错误的情况下调用任何参数来调用timer.stop();。我已将timer.stop();留在我认为需要在代码中的位置,但它会收到该错误。

所以简而言之,我希望能够告诉计时器在满足参数时启动,即当玩家完成一圈时。而且我希望能够告诉计时器在达到某个值时停止。

提前感谢我确信我会收到的好建议。注意:这不是整个代码,只是相关信息。

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;

public class RacerDoom extends JFrame {
    int counter = 0;
    int p1Laps = 0;
public RacerDoom() {
        //create JFrame
        super("Racer Doom Squared");
        setSize(WIDTH,HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        //set up Timer
        final Timer timer=new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(counter>=10) {
                    timer.stop(); //error here reads "local variable timer may
                                    //not have been initialized"
                }
                else{
                   counter++;
                   }
                System.out.println(counter);
            }
        });
        //inner class threads
        Move1 m1 = new Move1();
        m1.start();
        //start timer
        if(p1Laps>=1) {
            timer.start(); //error here is that timer will not start when
                            //p1Laps>=1
        }
    }
    private class Move1 extends Thread implements KeyListener {
        public void run() {
            addKeyListener(this);
            while(true) {
                try {
                    repaint();
                    //collisions
                    if(p1.intersects(finishtop)&&p1Direction==UP&&p1cross!=true){
                        p1cross=true;
                        p1Laps++;
                        p1Boost++;
                        counter=0;
                        System.out.println(p1Laps);
                    }
                    if(p1.intersects(finishtop)==false) {
                        p1cross=false;
                    }
    public static void main (String [] args) {

        new RacerDoom();
    }
}

2 个答案:

答案 0 :(得分:4)

由于您希望在代码中的不同位置启动和停止计时器,您应该将其作为成员变量。这将解决您尝试在动作侦听器中停止计时器的问题。

变量p1Laps在构造函数中不会改变(在将其初始化为0之后),因此您需要在更改plLaps值的位置启动计时器。我不确定从另一个线程(Move1)调用timer.start()是否安全。因此,使用SwingUtilities.invokeLater()启动计时器可能更安全。

答案 1 :(得分:1)

快速修复:

而不是

timer.stop();

待办事项

((Timer)e.getSource()).stop();

ActionEvent的getSource方法将返回对调用actioPerformed方法(Timer)的对象的引用,因此这应该有效。

您的代码可能还有其他问题,包括没有Thread.sleep(...)的后台线程,使用KeyListeners而不是Key Binding,在后台线程中添加KeyListener,......