はじめに
多くのGUIを使ったプログラムでは、ユーザーの操作などに関する処理を「イベント」と呼ばれるものを利用して処理します。イベントというのは、さまざまなプログラムへのアクションに応じて発信される「信号」のようなものだと考えてください。例えば、ユーザーがマウスでボタンをクリックすると、それに対応するイベントが発生する。このイベントに応じて何らかの処理が実行される。そういう仕組みになっているわけです。
GUIのプログラミングでは、このイベント処理が非常に重要となります。Javaに用意されているイベント処理の仕組みについて、ここでしっかりと理解しておきましょう。
対象読者
- Javaに興味はある、けれどプログラミング経験がない、という人。
- Javaに興味はある、けれど何から手をつければいいかわからない、という人。
- Javaに興味はない、でも何でもいいからプログラミングをしたい、という人。
これまでの記事
- Java入門 (1) - まずはここから始めよう
- Java入門 (2) - 値と制御構文
- Java入門 (3) - クラスとインスタンス
- Java入門 (4) - Swingを使ったGUIプログラミング
Swingのイベントシステムとは?
Swing(というよりJava全般)のイベントシステムは、一般に「代理イベント」方式(デリゲートイベント方式)と呼ばれています。イベントが発生したコンポーネントに代って、専用のクラスが処理を受け持つことからこう呼ばれています。
イベント処理の基本は「イベントが発生すると、それに対応するメソッドが実行される」というものです。システムには、あらかじめ「こういうイベントが発生したら、このメソッドが呼び出される」というような処理の仕組みが組み込まれています。イベントに対応した処理をしたければ、それによって呼び出されるメソッドを用意し、その中に処理を記述しておけばよいわけです。
しかし、この「コンポーネントの中に、イベントに対応するメソッドを用意しておく」というやり方は、すなわち「常にすべてのイベントが垂れ流されている」という状態であることになります。メソッドを書くだけでそれが呼び出されるということは、メソッドがあろうがなかろうが、常にすべてのイベントが発生し、「対応メソッドはないかな?」と探し続けているわけです。これはかなり無駄なやり方という気がします。また、後からイベントを追加するなどの拡張性にも乏しいと言えます。
そこで、Swingではイベントの処理を行うための専用クラスを設け、これにイベント処理を代理させることにしました。コンポーネントでは、原則としてイベントは発生しません。イベント処理用のクラスがまったく組み込まれていない状態だと、何かイベントが発生しそうな操作をしても、そのコンポーネントではイベントが起こらないのです。そして、そのコンポーネントにイベント処理用のクラスを組み込むと、それに対応するイベントが発生するようになります。そしてイベントが発生したら、その処理用クラスに用意されているメソッドが呼び出される、というわけです。
このイベントの処理を代理で行うクラスを「イベントリスナー」と言います。イベント処理を行う場合は、このイベントリスナーのクラスを定義し、そこに必要なメソッドを用意して処理を記述します。コンポーネントには、そのコンポーネントで利用可能なイベント用のイベントリスナーを組み込むためのメソッドが用意されており、これを使ってイベントリスナーのインスタンスを組み込みます。これで、そのコンポーネントでイベントが発生したら、組み込んだイベントリスナー内のメソッドが呼び出され、処理が実行されるようになるわけです。