SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

作って覚えるJavaプログラミングのススメ

Java入門 (5) - Swingにおけるイベント処理

作って覚えるJavaプログラミングのススメ 第5回

イベントリスナーとインターフェース

 では、実際にイベントリスナーを使ってみましょう。まずは、イベントの中で最も使用頻度の高い「ボタンをクリックしたときのイベント」を使ってみることにしましょう。JButtonをクリックしたときに発生するイベントは「アクションイベント(ActionEvent)」というものです。これを処理するイベントリスナーは「アクションリスナー(ActionListener)」というものになります。これは、java.awt.eventパッケージに「ActionListener」というインターフェースとして用意されています。

 インターフェースは、普通のクラスとはちょっと違います。これは、「概要を記述しただけの特殊なクラス」と考えるとよいでしょう。さまざまな「仕様」を記述するのに用いられるものです。インターフェースの詳細については、今はまだあまり深く知る必要はありません。重要なのはこれの使い方です。

 インターフェースは、「1つのクラスに、複数の機能を持たせるために用いる」ことが多いのです。皆さんは、既に「継承」というものを使って、あるクラスの機能をそのまま持たせて新しいクラスを作ることができるのを知っています。しかしこの継承は、常に「1つのクラス」だけしか使えません。例えば「AとBのクラスの機能をそのままもらって新しいクラスを作りたい」と思っても、継承では不可能になります。

 インターフェースは、1つのクラスにいくつでも組み込むことができます。インターフェースとして用意することで、同時にさまざまな機能をクラスに持たせることができるようになるわけです。このインターフェースは、次のようにしてクラスに組み込みます。

class クラス implements インターフェイス {……略……}

 implementsの後に、インターフェース名を記述するだけです。複数のインターフェースをimplementsしたい場合は、それぞれをカンマで区切って記述します。

 重要なのは、「インターフェースをimplementsしたクラスでは、そのインターフェースに用意されているメソッドをすべて実装しなければいけない」という点です。この点は、extendsによる継承と大きく異なる部分でしょう。

アクションリスナーを作る

 では、ボタンクリックの処理をするアクションリスナーを作成し、JButtonに組み込んでみましょう。

package codezine.java;

import java.awt.event.*;
import javax.swing.*;

public class Sample extends JFrame {
    JLabel label;
    JTextField field;
    JButton button;
    
    public Sample(){
        this.setSize(300,200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(null);
        
        // JLabelの組み込み
        String msg0 = "<html><h3>Sample</h3></html>";
        label = new JLabel(msg0);
        label.setSize(200,30);
        label.setLocation(20,20);
        this.add(label);
        // JTextFieldの組み込み
        field = new JTextField();
        field.setSize(200,20);
        field.setLocation(20,50);
        this.add(field);
        // JButtonの組み込み
        button = new JButton("JButton");
        button.setSize(100,25);
        button.setLocation(20,80);
        button.addActionListener(new ActionAdapter());
        this.add(button);
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.setVisible(true);
    }

}

class ActionAdapter implements ActionListener {
    
    public void actionPerformed(ActionEvent ev){
        System.out.println("You clicked Button!");
    }
}
プログラムを実行する。ボタンをクリックすると、コマンドプロンプトにテキストが出力される。
プログラムを実行する。ボタンをクリックすると、コマンドプロンプトにテキストが出力される。

 ここでは、System.out.printlnを使って、ボタンをクリックしたらメッセージを出力させています。起動して現れたウインドウにあるボタンをクリックして、イベント処理が実行されていることを確認しましょう。

ActionListenerインターフェースの利用法

 アクションリスナーは、java.awt.event.ActionListenerというインターフェースとして用意されています。これを利用するため、通常はjava.awt.event.ActionListenerをimportしておきます。

 ここでは、implements ActionListenerしたクラスとして、ActionAdapterというクラスを定義しています。このActionListenerには、以下のようなメソッドが用意されています。

public void actionPerformed(ActionEvent ev){……略……}

 従って、implements ActionListenerしたクラスでは、必ずこのメソッドを作成しておかなければいけません。ここに処理を記述すれば、アクションイベントが発生したときにそれが実行されるようになります。引数にあるActionEventは、やはりjava.awt.eventパッケージにあるクラスで、発生したアクションイベントに関する情報を管理するものです。とりあえず、この中身については、今は深く考えないでおきましょう。

 では、このActionAdapterをどうやってJButtonに組み込めばよいのでしょうか。コンストラクタを見てみると、こんな文が見つかるはずです。

button.addActionListener(new ActionAdapter());

 このaddActionListenerというのが、ActionListenerを組み込むためのメソッドです。これでbuttonにActionAdapterが組み込まれます。たったこれだけで、ボタンをクリックしたときの処理ができあがってしまいました。アクションリスナーの作成さえきちんとできれば、それほど複雑ではありません。

 これはアクションリスナーの利用例ですが、基本的なイベントリスナーの使用法は、どのイベントでも大体同じです。そのイベント用に用意されているイベントリスナーのインターフェースをimplementsしてクラスを作成し、それを組み込みのためのメソッドでコンポーネントに組み込む。これで、そのコンポーネントでイベントが発生すれば、指定のメソッドを実行するようになるのです。イベントによってイベントリスナーは違いますし、場合によっては複数のメソッドが用意されていたり、メソッドの引数に渡されるクラスが違ったりしますが、全体の流れはほぼ同じです。

 また、イベントリスナーやそれを組み込むメソッドを見ると、イベント関係のものに一定の命名規則があるらしいことが想像できます。アクションイベントを処理するのはActionListenerで、それを組み込むのがaddActionListenerということになります。その他のイベントについても、だいたいこのようにイベント名とリスナー名、組み込みメソッド名は一定の規則に従って命名されてます。

次のページ
JFrame継承クラスにimplementsする

この記事は参考になりましたか?

作って覚えるJavaプログラミングのススメ連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2194 2008/02/21 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー