1

问题,我只能执行一次计时器。我知道它是因为我调用了函数 timer2.cancel(); 和 timer1.cancel(); :: 取消“永远不再运行它”。我需要一个替换功能,它实际上会停止计时器,但当我重新安排它时可以再次启动它。我该怎么做呢?

      public void actionPerformed (ActionEvent e){

      if (e.getSource()==jbtStart)
      {

          System.out.println("Start is pressed");
          timer2.cancel();        
          timer1.schedule(new Task(), 0, delay);
      }

      else if (e.getSource()==jbtStop)
      {   
            System.out.println("Stop is pressed");
            timer1.cancel();        
            timer2.schedule(new Task2(), 0, delay);

      }
4

2 回答 2

2

为什么不在Timer那个时候创建​​一个新的?要么,要么保留TimerTask计时器,然后取消计时器不是计时器本身。

作为第三种可能的选择,有一个定时器任务和一个定时器,但让定时器任务知道它在任何时候意味着什么——看起来你在每次定时器滴答作响时有效地切换你想要做的事情. 您总是可以保留两个单独的类来分离逻辑功能,然后有一个“包装器”任务,它允许您替换每次运行时执行的行为。

于 2011-10-03T06:09:36.560 回答
1

我会取消 TimerTasks 而不是 Timer(我只会使用一个 Timer)。

更新:

   private Task task1;
   private Task2 task2;

 public void actionPerformed (ActionEvent e){

      if (e.getSource()==jbtStart)
      {

          System.out.println("Start is pressed");
          if (task2 != null) {
              task2.cancel();
          }
          task1 = new Task();
          timer.schedule(task1, 0, delay);
      }

      else if (e.getSource()==jbtStop)
      {   
            System.out.println("Stop is pressed");
            if (task1 != null) {
                task1.cancel();
            }
            task2 = new Task2();
            timer.schedule(task2, 0, delay);
      }
于 2011-10-03T06:09:00.197 回答