講義編6
「イベント・モデル」
 
← 前  :  次 →

お楽しみの GUI プログラミングへ入る前に,Java の「イベント・モデル」について 学習しておきましょう.

Java は基本的に,イベント・ドリブン方式で動作しています. マルチ・スレッド処理を行えば,その限りではありません. 大抵の場合,ユーザが何か(「ボタンを押した」など)をしたときに, イベントが発生して なんらかの処理が実行されます.

次の単語を押さえておきましょう.

イベントの通知は,イベント・ソースに関連付けられたイベント・リスナへ, イベント・オブジェクトを渡すことで行われています.

文章ではわかりづらいので,例を見てみます.

ボタンを表現する「javax.swing.JButton」クラスの,API ドキュメントを見てください. このクラスは,ボタンの抽象表現クラス「javax.swing.AbstractButton」を 継承しています. そして AbstractButton クラスには,addActionListener() というメソッドが 用意されています.これが,ソースとリスナを関連付けるためのものです.

関連付けには,「java.awt.event.ActionListener」インタフェースを実装した クラスのインスタンスを引数に渡します. つまり「〜 Listener」インタフェースを実装したものが, イベント・リスナということになります.

発生通知では,「〜 Listener」インタフェースで仕様制定されているメソッドが 直接 呼び出されます. ActionListener インタフェースでは actionPerformed() メソッドです. このときの引数がイベント・オブジェクトとなっています. もちろんこの例では「java.awt.event.ActionEvent」クラスのインスタンスです.

わかりましたか?
なお,Java1.0 と Java1.1 以降のイベント・モデルには,大きな違いがあります. 版数の古い資料(Java1.0 対応)を読むときには,イベント周りの内容を 読まないようにしましょう.

ちなみに,どんなイベントの種類があるかは,以下のパッケージを 参照してみてください.

この中で使用頻度の高いものは,ボタンやメニュー等に使う「Action」と マウス関連に使う「Mouse」などです.
以下は参考知識,「アダプタ」について.

イベント・リスナは全て,インタフェースで提供されています. そのインタフェースを実装したクラスは,当然インタフェース内で決められている メソッドの定義をしなければなりません. それは,何の処理もさせないメソッドについても,「処理がない」メソッドとして 書かなければなりません.

とても面倒くさい作業です.
例えば「java.awt.event.MouseListener」インタフェースでは,5つのメソッドが あります.

マウスが入ったら処理するだけのプログラムを作るとしても,そのクラスでは 4つの空定義メソッドを つらつら と書かなければなりません.とっても面倒.

この面倒さを解決してくれるのが,「イベント・アダプタ」です. アダプタ・クラスの中身はとてもシンプルで,関連するリスナを実装して, その全てのメソッドを空定義で実装しています.

あとはユーザがイベント・リスナを作成したいとき,そのアダプタを継承して 必要なメソッドだけをオーバ・ライドしてあげれば良いのです. 先の例も,「java.awt.event.MouseAdapter」クラスを継承したクラスにすれば, 「マウスが入ったら処理する」メソッドを再定義するだけで済みます.

ただし!
Java には多重継承がありません.
作成している自分のクラスが,既にほかの親クラスを継承していたとしたら・・・. 観念してインタフェースを実装し,空定義メソッドを書きましょう.


表紙へ戻る