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
      }
   };

求められたシナリオ:

  • action_1 の期間は action_2 とは異なります
  • 期間中action_1を実行します(duration _1と言います)
  • action_1 を期間 _1 完了した後
  • action_2 を期間 _2 実行する
  • action_2 を期間 _2 完了した後
  • duration_1 の間、action_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: テキストを 1 秒間 "A" に設定します。
  • action_1 を 1 秒間実行した後
  • action_2: テキストを 2 秒間 "B" に設定します
  • action_2 を 2 秒間実行した後
  • action_1: テキストを 1 秒間 "A" に設定します
  • 等々。

  • action_1 は、action_2 がそのインターバルを終了した後でのみ、後続のインターバルを実行します。

  • action_2 は、action_1 がそのインターバルを終了した後でのみ、後続のインターバルを実行します。

....

それを達成する方法について何か考えはありますか?

4

1 に答える 1

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);
    }
}
于 2013-08-22T19:14:19.020 に答える