Timerクラスを利用したアニメーション

  1. Timerクラス
  2. プログラム例
  3. 課題


Timerクラス

javax.swing.Timerクラス ( Oracle   Javaドキュメントを参照のこと)

指定された間隔で、1 つ以上の ActionEvent をトリガーします。 たとえば、アニメーションオブジェクトは、 フレームを描画するトリガーとして Timer を使用します。

タイマーの設定には、Timer オブジェクトの生成、 オブジェクトへの 1 つ以上のアクションリスナーの登録、 および start メソッドを使用したタイマーの起動が含まれます。 たとえば、 次に示すコードでは、 Timer コンストラクタへの最初の引数によって指定されたように、 アクションイベントが 1 秒間に 1 回生成されて起動されます。 Timer コンストラクタへの 2 番目の引数では、 タイマーのアクションイベントを受信するリスナーを指定しています。

     int delay = 1000; //milliseconds
     ActionListener taskPerformer = new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
             //...Perform a task...
         }
     };
     new Timer(delay, taskPerformer).start();

Timers を構築する際は、遅延パラメータと ActionListener の両方を指定しま す。 遅延パラメータ(delay)は、初期遅延と、 イベントがトリガーされるまでの遅延の両方の 設定に使用します。 単位はミリ秒です。 タイマーは、開始後、 登録されたリスナーに対する最初の ActionEvent がトリガーされるまでの初期遅延を待機します。 この最初のイベントの発生後は、タイマーが停止するまで、 イベント間遅延が経過するたびにイベントをトリガーする処理を継続します。

構築後、初期遅延とイベント間遅延は別々に変更できます。 新たに ActionListeners を追加することもできます。

タイマーを 1 回だけトリガーしたあと停止するには、 タイマーで setRepeats(false) を呼び出します。

すべての Timer は、 実行する最初の Timer オブジェクトが作成した単一の共有スレッドを使用して待機処理を実行しますが、 Timer のアクションイベントハンドラは、 それとは別のイベントディスパッチスレッドで実行されます。 そのため、Timer のアクションイベントハンドラは Swing コンポーネントの操作を安全に実行できます。 ただし、一方で Timer のアクションイベントハンドラは、 GUI の応答を維持できるよう、 迅速に動作する必要があります。

バージョン 1.3 では、 新しい Timer クラス java.util.Timer が Java プラットフォームに追加されています。 このクラスと javax.swing.Timer の基本的な機能は同じですが、 java.util.Timer はより汎用的でより多くの機能を持っています。 javax.swing.Timer には、GUI での使用を容易にする 2 つの特徴があります。 1 番目は、イベント処理メタファが GUI プログラマになじみのあるもので、 イベントディスパッチスレッドの扱いが簡単になっていることです。 2 番目は、自動共有スレッドにより、 生成するスレッドの数が多大になるのを回避するための特別な手順が不要になることです。 ただし、タイマーは、カーソルの点滅やツールヒントの表示などと同じスレッドを使用します。

タイマーの詳細と使用例については、 『The Java Tutorial』の「How to UseTimers」を参照してください。 この Timer クラスと java.util.Timer の選択基準や使用例については、 『The Swing Connection』の「Using Timers in SwingApplications」 を参照してください。
( Oracle   Javaドキュメントより)


Timerの機能

指定された時間間隔で ActionEvent を繰り返し発生させる

Timerの設定例

public class Example implements ActionListener {
    ....
    public void actionPerformed(ActionEvent evt) {
        // 処理内容
    }
    public static void main(String args[]) {
       ...
       delay = 1000;                        // 遅延時間[ミリ秒]
       Timer time = new Timer(delay, this); // タイマーを生成
       timer.start();                       // スタート
       ...
   }
}


プログラム例

Timerを利用したアニメーションプログラム

actionPerformedメソッドが呼び出されるたびに, 描画図形を変化させることでアニメーションを実現する.
  1. NetBeansのもとで,新規にプロジェクト AnimDemoを作成する
    • カテゴリ:  Java
    • プロジェクト:  Javaアプリケーション
    • プロジェクト名:   AnimDemo
    • [注意] 「メイン・クラスの作成」のチックを外す
  2. 新規にファイルを作成する
    • カテゴリ:  Sing GUI フォーム
    • ファイル・タイプ:  JFrame フォーム
    • ファイル名:  Animation
  3. デザイン・ウィンドウ
    • デザイン画面を表示して,JFrame内に 開始ボタン(jButton1)と描画用パネル(jPanel1)を配置する
    • 次のステップで, ボタン(jButton1)をクリックしたときのイベントハンドラを登録する
  4. ソース・ウィンドウ
    • import文の追加
      • ソース・ファイルの先頭に次のimport文を置く

        import java.awt.*;
        import java.awt.event.*;
        import javax.swing.Timer;

    • クラス宣言に ActionListener を実装(implement)する

      public class Animation extends javax.swing.JFrame implements ActionListener {

    • 変数の追加
      int delay = 250; // 繰り返しの間隔時間[ミリ秒]
      Timer timer; // タイマー
      int counter = 0; // カウンタ変数
      final int last = 100;
    • Timerイベント発生時の処理
      public void actionPerformed(ActionEvent evt) {
          counter++;                      // カウンタを1つ進めて
          if(counter >= last) counter = 0;
          repaint();                      // 再描画する
      }
    • ボタンクリックに対するイベントハンドラ関数 jButton1ActionPerformed
      private void jBUtton1ActionPerformed(java.awt.event.ActionEvent evt) {
         // jButton1がクリックされたときの処理
         if(timer == null) {
            timer = new Timer(delay, this);  // Timerを生成する
            timer.start();                   // Timerをスタートする
         }
         else {
            timer.stop();  // Timerを停止する
            timer = null;
         }
      }
      
      
    • 図形の描画処理
      public void paint(Graphics g) {
         Graphics gr = jPanel1.getGraphics();
         int w = jPanel1.getWidth();
         int h = jPanel1.getHeight();
         gr.clearRect(0, 0, w, h);
         gr.setColor(Color.BLUE);
         gr.fillOval(w/2+counter, 0, 2*counter, h);
      }
      
  5. 実行


演習問題

上の例題に示したプログラムを次のように変更し, Timerの使用法方法を納得せよ.