重用计时器任务Java

重用计时器任务Java,java,swing,timer,timertask,Java,Swing,Timer,Timertask,Soo使用扩展timertask创建了一个计时器 label_1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent arg0) { label_1.setVisible(false); label_2.setVisible(true);

Soo使用扩展timertask创建了一个计时器

label_1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                label_1.setVisible(false);
                label_2.setVisible(true);
                timer.purge();
                class MyTimeTask extends TimerTask
        {   
            public void run(){
            genReelNumbers();
            laa++;
           if(laa==50){
            timer.cancel();
            timer.purge();
                laa=0;
            label_1.setVisible(true);
            label_2.setVisible(false);}}}
                timer.purge();
                timer.schedule(new MyTimeTask(), 0, 50);}});

但是我得到一个错误,计时器已经取消了!正如您所见,我已经尝试使用purge(),所以它取消了“已取消”计时器(不知道这是否有意义)。我想每次按下标签时都使用这个计时器!有什么想法吗?

取消计时器后,除了创建一个新对象之外别无选择。

首先,这看起来是一个Swing应用程序,如果是这样,你就不应该使用java.util.timer和java.util.TimerTask,因为Swing是单线程的,上面的两个类创建一个或多个新线程来实现它们的操作,这意味着应该在Swing事件线程上调用的重要代码将不会在此线程上调用。这有可能导致抛出有害的间歇性和难以调试的线程异常。相反,请使用一个。然后,要停止此计时器,只需对其调用
stop()
,要重新启动它,只需对其调用
start()
。欲了解更多信息,请阅读:

例如,我不能100%确定您的代码应该做什么,但它可能看起来像:

// warning: code not compile- nor run-tested
label_1.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent arg0) {
        label_1.setVisible(false);
        label_2.setVisible(true);

        // assuming a javax.swing.Timer field named timer
        if (timer != null && timer.isRunning()) {
            // if the timer is not null and it's running, stop it:
            timer.stop();
        }

        // TIMER_DELAY is an int constant that specifies the delay between "ticks"
        timer = new Timer(TIMER_DELAY, new ActionListener() {
            @Override  // this method will be called repeatedly, every TIMER_DELAY msecs
            public void actionPerformed(ActionEvent e) {
                genReelNumbers();
                laa++;
                if(laa==50){
                    timer.stop();
                    // timer.purge();
                    laa=0;
                    label_1.setVisible(true);
                    label_2.setVisible(false);
                }
            }
        });
        timer.start();
    }
});

我遵循@Hovercraft的建议,改为javax.swing.Timer

结果是这样的:

//The variable "taxa" is the amount of times that i want it to do the task
    javax.swing.Timer time1 = new javax.swing.Timer(taxa, new ActionListener() {


            public void actionPerformed(ActionEvent e) {

                genReelNumbers();

            }
            });
//starts the timer
         time1.start();


//New timertask
            TimerTask tt = new TimerTask() {

            @Override
            public void run() {
//stops the timer
            time1.stop();
            label_2.setVisible(false);
            label_1.setVisible(true);
            verificarodas();
            }
            };
            Timer time = new Timer(true);

    // the 2000 is how long i want to do the task's
   //if i changed to 3000 it would take 3 seconds (remember it has to be a value on miliseconds) to do the 15 times, and soo on

            time.schedule(tt, 2000);

Soo我怎么能仍然使用计时器,但让他“停止”?他不应该使用java.util.timer,因为这是一个Swing应用程序。是的,我按照你的建议,从Swing开始使用计时器!谢谢您现在似乎同时使用Swing计时器和java.util.Timer与TimerTask,如果是这样,我不建议您这样做,原因与我在回答中概述的相同。如果你想要一个更全面的答案,请告诉更多关于你正试图用这些计时器做什么。你想引出什么样的行为?