2013-08-22 94 views
0

我將演示使用代碼實現的目標。如何使用計時器以兩個不同的間隔/持續時間執行兩個不同的動作?

創建計時器參考 Timer timer;

構建和初始化定時器

timer = new Timer(duration, timerAction); 
timer.start(); 

現在timerListener

AbstractAction timerAction = new AbstractAction() 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      //Perform some action for duration 
      jlabel.setText("A"); //action_1 

      //See description under code 
      jlabel.setText("B"); // action_2 
     } 
    }; 

的seeked場景:

  • ACTION_1具有從ACTION_2
  • 執行對於持續時間ACTION_1不同的持續時間(比如持續時間_1)
  • 完成ACTION_1爲持續時間_1
  • 爲持續時間_2
  • 執行ACTION_2完成ACTION_2爲持續時間_2後後
  • 執行action_1 for duration_1
  • 依此類推。

  • action_1僅在action_2完成其間隔後才執行其後續時間間隔。

  • action_2僅在action_1完成其間隔後才執行其後續時間間隔。

來描述它例如在:允許採取這些行動

 jlabel.setText("A"); //action_1 

     jlabel.setText("B"); // action_2 
  • ACTION_1具有不同的持續時間ACTION_2
  • ACTION_1:將文本設置爲 「A」 的持續時間爲1秒。
  • 1個秒鐘
  • ACTION_2執行ACTION_1後:將文本設置爲 「B」,如持續時間2秒
  • 2秒
  • ACTION_1執行ACTION_2後:將文本設置爲 「A」,如持續時間1秒
  • 依此類推。

  • action_1僅在action_2完成其間隔後才執行其後續時間間隔。

  • action_2僅在action_1完成其間隔後才執行其後續時間間隔。

....

如何實現它的主意?

+0

由一個共同的因素必然密切相關的持續時間(例如,1秒和2秒),還是可以完全隨機? – chrylis

+0

不是隨機的,action_1和action_2一個接一個地依次執行,每個執行一個接一個的指定的持續時間,一旦完成後續的動作開始。謝謝 –

回答

1

也許是這樣的:

public class DoubleActionTimer { 

    private final Action action1; 
    private final Action action2; 

    private final int delay1; 
    private final int delay2; 

    private final Timer timer; 

    private DoubleActionTimer(Action action1, int delay1, Action action2, int delay2) { 
     this.timer = new Timer(delay1, new ActionSwitcher()); 

     this.action1 = action1; 
     this.delay1 = delay1; 
     this.action2 = action2; 
     this.delay2 = delay2; 

     this.timer.setRepeats(false); 
     this.timer.start(); 
    } 

    public void stop() { 
     this.timer.stop(); 
    } 

    private class ActionSwitcher extends AbstractAction { 

     private boolean flag = false; 

     /** 
     * Invoked when an action occurs. 
     */ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      final Action action = flag?action2:action1; 
      final int delay = flag?delay1:delay2; 
      flag = !flag; 

      action.actionPerformed(e); 
      timer.setInitialDelay(delay); 
      timer.start(); 
     } 
    } 


    public static void main(String[] args) throws InterruptedException { 
     final Action action1 = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Action1"+new Date()); 
      } 
     }; 
     final Action action2 = new AbstractAction() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println("Action2 "+new Date()); 
      } 
     }; 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new DoubleActionTimer(action1, 500, action2, 3000); 
      } 
     }); 

     TimeUnit.SECONDS.sleep(60); 
    } 
} 
相關問題