Swingを利用したウィンドウの表示ボタンやラベルの配置テキスト入力と来たので、イベント処理を取り入れたGUIアプリケーションを作成する。

GUIアプリケーションにおいて、

  1. ユーザーの操作を検知する
  2. アプリケーションの振る舞いを状況に応じて判断する
  3. ユーザーの期待する処理を実行する

という一連の作業をプログラミングする必要がある。

Swingには、この一連の作業を簡単にプログラミングできるような仕組みであるイベント処理のモデル(アクション、イベント、アクション・リスナー)があらかじめ用意されている。

アクション
GUIコンポーネント(ボタン、テキストフィールド、メニュー等)に対してユーザーが行う操作を「アクション」という。
例えばボタンをクリックする、メニューを選択する等の行動を指す。

イベント
ユーザーが操作した事実およびユーザーの操作に関する情報を保持するオブジェクトを「イベント」という。
このイベントはコンポーネントに対してアクションが行われるたびに生成される。
例えばボタンAがクリックされた、ボタンBがクリックされた、メニュー「ファイル」が選択された、といったアクションを行うと、コンポーネントはその事実や情報を保持するためのクラス「java.awt.event.ActionEvent」のインスタンスを生成する。

アクション・リスナー
ユーザーの操作に応じて一定の処理を行うインターフェイスを「アクション・リスナー」という。
アクション・リスナーはインターフェイス「java.awt.event.ActionListener」であるため、具体的な処理を記述できない。
そのため、例えば音を鳴らす、ダイアログボックスを表示する、といった具体的なアプリケーションの処理はそのインターフェイスを実装した具象クラスのメソッド(actionPerformed)にプログラミングすることになる。

 

アプリケーションの振る舞いを実装

プロジェクトの作成

プロジェクト名「SwingSample04」を作成する。

1.[ファイル]⇒[新規]⇒[プロジェクト]を選択

2.[Javaプロジェクト]を選択し[次へ]をクリック

3.プロジェクト名等を入力し[完了]をクリック

  • プロジェクト名に「SwingSample04」を入力
  • プロジェクト・レイアウトで[プロジェクト・フォルダーを・・・]を選択

クラスの作成

GUIアプリケーションの起動、コンポーネントの配置、コンポーネントのアクションに応じた処理を担当するクラス「SwingAppMain」を作成する。

1.[ファイル]⇒[新規]⇒[クラス]を選択

2.[新規Javaクラス]ダイアログで各項目を入力し[完了]をクリック

  • パッケージに「swing.sample」を入力
  • 名前に「SwingAppMain」を入力
  • public static void main(String[] args)をチェック

3.作成したクラスのソースコードを以下のように変更

4.[実行]→[Javaアプリケーション]を選択して、実行する

実行した結果、テキスト入力用コンポーネント、追加・消去のボタンが配置されたウィンドウが開く。
ユーザーの操作([追加]ボタンのクリックというアクション)に応じてテキストフィールドに入力されている文字列をテキストエリアに追加する。
ユーザーの操作([消去]ボタンのクリックというアクション)に応じてテキストエリアの文字列をすべて消去する。

 

アクション・リスナーの実装
ボタンに対してユーザーの操作(アクション)に反応するためには「ActionListener」をimplementsしたクラスを定義する必要がある。
今回の例では「SwingAppMain」自身がその役割を担っている。

このインターフェイスは抽象メソッド「actionPerformed」を宣言しているため、「ActionListener」インターフェイスはimplementsするだけでは機能しない。
そのため「SwingAppMain」固有の「actionPerformed」メソッドを定義する。

 

アクション・リスナーの登録

ボタンはアクションがあった場合に、どのクラス(メソッド)を実行すればよいかをあらかじめ知っておく(関連付けておく)必要がある。
そのため「addActionListener」を記述し、ボタンとアクション・リスナーを実装したクラスとを関連付ける。
「addActionListener」の引数には「ActionListener」をimplementsしたクラスのインスタンスを設定する。
今回の例では「SwingAppMain」自身となるため「this」を設定している。
上記のコードを記述することで[追加]ボタンまたは[消去]ボタンがクリックされたとき「SwingAppMain」クラス固有の「actionPerformed」が実行されるようになる。

 

ユーザーの操作に応じた処理の実装
ボタンに対してアクションを行うと「ActionEvent」のインスタンスが生成される。
今回の例では、「追加」ボタンまたは「消去」ボタンに対して行われたアクション(クリック)の結果として生成された「ActionEvent」クラスのインスタンスの情報を基にアプリケーションの振る舞い(actionPerformed)を変えている。