Runnable は java.lang パッケージに含まれています。アプレットで
アニメーションなどを実現する場合にも登場します。
Runnable は次のように run() という名前のメッソドを abstract に定義します。
public interface Runnable {
public void run(); // インターフェイスなのでabstract修飾子は省略可
}
これだけです。
実際に必要な作業の大半は Runnableが実装されるクラスの側が行います。
たとえば、Threadクラスのオブジェクトを生成するのも、実装側の仕事です。
import java.awt.Frame;
import java.awt.Color;
/** 様々に色が変化する ColorfulFrameクラス */
public class ColorfulFrame extends Frame implements Runnable {
/** スレッド */
public Thread thread;
/** 色のデータの表 */
protected Color colors[];
/** カウンタ */
private int count=0;
/** コンストラクタ */
ColorfulFrame( int width, int height ) {
super();
colors = new Color[7];
colors[0] = Color.red; colors[1] = Color.orange;
colors[2] = Color.yellow; colors[3] = Color.green;
colors[4] = Color.cyan; colors[5] = Color.blue;
colors[6] = Color.magenta;
thread = new Thread( this ); //スレッドの生成
setSize( width, height ); // JDK1.0 では resize()
setBackground( colors[0] );
show();
}
/** スレッドによって実行される仕事 */
public void run() {
while( thread.isAlive() ) {
try {
Thread.sleep(1000); // 一秒間停止
} catch(Exception e) {/* 本当は処理が必要 */}
setBackground( colors[count] );
count++;
if( count > 6 ) count=0;
}
}
}
この例は、Frameクラスをベースにして、時間によって色が変化するウィンドウ
を表示します。
thread = new Thread( this );
の行がポイントになります。this はこのクラス自身を表しますが、
Runnable がインプリメントされていない
(Runnableを継承していないと)とコンパイル時にエラーとなります。
MouseListener は java.awt.eventパッケージに含まれています。
このパッケージ内には MouseListener 以外にもイベントの種類に応じて
リスナのインターフェイスが用意されています。
MouseListener の場合、マウスボタンの上下とポインタのウィンドウからの出入り
を処理する全部で5個の abstract メソッドが含まれています。
したがって、MouseListenerをインプリメントするクラスは、
必ずこれらのメソッドのすべてを
(たとえ使用しなくとも)実装しなくてはいけません。
import java.awt.Frame;
import java.awt.Color;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
/** マウスの出入を感知する SensitiveFrameクラス */
public class SensitiveFrame extends Frame implements MouseListener {
/** コンストラクタ */
SensitiveFrame( int width, int height ) {
super();
setSize( width, height ); // JDK1.0 では resize()
addMouseListener( this ); // 自分自身を登録
show();
}
/** MouseListener の実装 */
public void mouseEntered( MouseEvent evt ) {
setBackground( Color.red );
}
public void mouseExited( MouseEvent evt ) {
setBackground( Color.white );
}
public void mouseClicked( MouseEvent evt ) {
/** 形式上必要 */
}
public void mousePressed( MouseEvent evt ) {
/** 形式上必要 */
}
public void mouseReleased( MouseEvent evt ) {
/** 形式上必要 */
}
}