1

問題、タイマーを実行できるのは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、タイマーと同様に保持し、タイマー自体の代わりにそれをキャンセルします。

3番目の可能な代替案として、単一のタイマータスクと単一のタイマーを用意しますが、タイマータスクに、いつでも何をするのかを認識させます-タイマーが刻むたびに、やりたいことを効果的に切り替えているように見えます。論理機能を分離するために常に2つの別個のクラスを保持し、実行ごとに実行される動作を置き換えることができる「ラッパー」タスクを持つことができます。

于 2011-10-03T06:09:36.560 に答える
1

タイマーの代わりにTimerTasksをキャンセルします(そして、1つのタイマーのみを使用します)。

アップデート:

   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 に答える