指定された間隔で、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ドキュメントより)
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(); // スタート
...
}
}
| import java.awt.*; |
| import java.awt.event.*; |
| import javax.swing.Timer; |
| public class Animation extends javax.swing.JFrame implements ActionListener { |
| int delay = 250; | // 繰り返しの間隔時間[ミリ秒] |
| Timer timer; | // タイマー |
| int counter = 0; | // カウンタ変数 |
| final int last = 100; |
public void actionPerformed(ActionEvent evt) {
counter++; // カウンタを1つ進めて
if(counter >= last) counter = 0;
repaint(); // 再描画する
}
|
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);
}