next up previous contents
Next: まとめ Up: アニメーションデモプログラム Previous: AnimDemo   目次

アニメーションの中断と再開

スレッド上での実行を途中で休止させたり, 休止常態にあるものをボタンをクリックすることで再開させたりする操作に, ここではフラグ(flag)を使用する. プログラム中で pauseメソッドを呼び出すことにより実行を休止させる. pauseメソッドには下図に示す動作をさせる:

pauseメソッドが呼び出されたときの処理:

  1. flagをONにする
  2. 300ミリ秒間休止する
  3. その後,flagがONのままであれば上のステップで戻る
  4. flagがOFFになったところでこのメソッドの実行を終え, 呼び出した側へ制御を戻す
ボタン2がクリックされるとflagがOFFになるようにしておく. このpauseメソッドが呼び出されるとボタンが押されるまで処理を中断すること ができる.

\includegraphics[width=60ex]{flag.eps}

[図] pauseメソッドによる処理の中断

          Boolean flag = false;

          private void pause() {
             flag = true;
             try {
                do {
                   myThread.sleep(300);
                } while (flag);
             } catch (Exception e) {}
          }

           [図] pauseメソッドのコード

表示をソース・ウィンドウに切り替え,以下の手順によりプログラムの不足部分を補う.

  1. スレッド上でこのプログラムが実行できるよう, この AnimDemo クラスに Runnable 属性を付加する
    11  public class AnimDemo extends javax.swing.JFrame implements Runnable {
    12
    
  2. pauseメソッドを定義する.あわせて,処理に必要な変数も宣言しておく
    20      Thread thread;
    21      int counter = 0;
    22      Boolean flag, stepFlag;
    23
    24      void pause() {
    25          flag = true;
    26          try {
    27              do {
    28                  thread.sleep(300);
    29              } while (flag && stepFlag);
    30          } catch (Exception e) {
    31          }
    32          return;
    33      }
    
  3. 1回のカウントアップと数値の表示を行うメソッド doCountUp を定義す る
    34
    35      void doCountUp() {
    36          jLabel1.setText(Integer.toString(counter));
    37          counter++;
    38          pause();
    39      }
    
    このメソッドではカウンタの値を表示し, カウンタを1つ進めた後にpauseメソッドを呼び出して処理を中断している

  4. スレッドとして実行するための run メソッドを定義する
    40
    41      public void run() {
    42            while (true) {
    43               while (counter <= 100) {
    44                   doCountUp();
    45               }
    46               counter = 0;
    47               stepFlag = true;
    48               jButton1.setText("Restart");
    49           }
    50      }
    
    43〜45行がカウントアップ処理のループである. 100までのカウントアップが終了すると46〜48行で,カウンタ値を0に戻して, カウントアップ再開の準備をしている
  5. 最後に,未完成であったボタンアクションを定義する
    114      private void jButton1ActionPerformed(java.awt,event.ActionEvent evt) {
    115          if(thread == null) {
    116              thread = new Thread(this);
    117              flag = false;
    118              stepFlag = false;
    119              thread.start();
    120          }
    121          else {
    122              stepFlag = !stepFlag;
    123          }
    124          if(stepFlag) {
    125              jButton1.setText("Cont.");
    126              jButton2.setText("Next");
    127          }
    128          else {
    129              jButton1.setText("Step");
    130              jButton2.setText("----");
    131          }
    132      }
    133
    134      private void jButton2ActonPerformed(java.awt.event.Actionevent evt) {
    135          flag = false;
    136      }
    
上で示したプログラムコードではstepFlagを使用しおり, pauseメソッドの説明図より若干複雑な動作をするが, ここでは説明を省略している.
\includegraphics[width=26ex]{counter.eps}

[図] 実行中の様子



TKinoshita 2016-07-13