トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Swingの基本:GUI部品のイベント処理

GUI部品のイベント処理

 JavaのGUIアプリケーションのイベント

  • 古いバージョン(1.0)ではGUI部品のクラス自体にイベント処理を実装していたが、柔軟性、効率性の面から、1.1からはデリゲーション(委譲、デリゲーションイベント)モデルが用いられるようになった。
    • イベント処理を行う専用のクラスを用意し、そのクラスにイベント処理を任せる
  • 開発者はイベント処理を行うリスナー(イベントを受け取る)クラス(○○Listner)を実装し、各GUI部品クラスに登録(add○○Listner)することになる。GUI部品に関してイベントが発生したときには、登録されたリスナークラスにイベントが渡され、そこで何らかの処理を実行する。

 イベント処理の実際

主要なイベントクラス

イベントクラス イベントの内容
ActionEvent 何かしらの操作をしたときに実行されるイベント(クリック、選択、入力完了など)
WindowEvent ウィンドウの操作に関するイベント(終了、最小化、最大化など)
FocusEvent フォーカスに関するイベント(フォーカスを獲得したとき、失ったとき)
MouseEvent マウスイベント(クリック、ダブルクリック、ポインタの移動など)
MouseWheelEvent マウスホイールイベント(マウスのホイール操作)
KeyEvent キーボードイベント(キー入力)
TextEvent テキスト入力に関するイベント(テキストフィールド、テキストエリア内の変更など)
ItemEvent 選択肢のイベント(チェックボックスやラジオボタンの選択など)
  • イベントリスナーはこれらのイベント名のEvent以前にListenerをつけたものになる
    • 例)ActionEvent⇒ActionListener
  • 複雑なイベントリスナーはすべてのメソッドを実装するのが煩雑なため、アダプタが用意されている
    • 例)WindowListener ⇒ WindowAdapter

 イベント処理の例

  • イベント処理を行うイベントリスナーであるが、開発ではいくつかの実装方法がある。
    1. 自クラスで実装
      • 発生するイベントの種類が少ない場合に向く
    2. 内部クラスで実装
      • 多くのイベントが発生し、各イベントの処理も比較的複雑な場合に向く
    3. 無名クラスで実装
      • 多くのイベントが発生するが、各イベントの処理は比較的単純な場合に向く
    4. 外部クラスでイベント処理を実装
      • 複雑な処理を行う場合にはこの方法を採るのがよいかもしれない。ただし、他の手法と比べ、値のやり取りが煩雑になる。

自クラスでイベントリスナーを実装

  • GUIEvent01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package sample.swing.event;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class GUIEvent01 extends JFrame implements ActionListener {
    private int counter;
    public GUIEvent01() {
        // フレーム関係の初期化
        setTitle("ボタンは一度も押されていません");
        // ボタンを追加
        JButton button = new JButton("このボタンを押すとタイトルの回数が変わります");
        button.addActionListener(this);
        add(button);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ×を押したときに終了するように
        pack();
        setVisible(true); // 可視化
    }

    public void actionPerformed(ActionEvent e) {
        counter++;
        setTitle("ボタンを押した回数:" + counter + "回");
    }
    public static void main(String[] args) {
        new GUIEvent01();
    }
}

内部クラスでイベントリスナーを実装

  • GUIEvent02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package sample.swing.event;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class GUIEvent02 extends JFrame {
    private int counter;
    public GUIEvent02() {
        // フレーム関係の初期化
        setTitle("ボタンは一度も押されていません");
        // ボタンを追加
        JButton button = new JButton("このボタンを押すとタイトルの回数が変わります");
        button.addActionListener(new ButtonListner());
        add(button);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ×を押したときに終了するように
        pack();
        setVisible(true); // 可視化
    }
    //内部クラス
    class ButtonListner implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            counter++;
            setTitle("ボタンを押した回数:" + counter + "回");
        }
    }
    public static void main(String[] args) {
        new GUIEvent02();
    }
}

無名クラスでイベントリスナーを実装

  • GUIEvent03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package sample.swing.event;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class GUIEvent03 extends JFrame {
    private int counter;
    public GUIEvent03() {
        //フレーム関係の初期化
        setTitle("ボタンは一度も押されていません");
        //ボタンを追加
        JButton button = new JButton("このボタンを押すとタイトルの回数が変わります");
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                counter++;
                setTitle("ボタンを押した回数:"+counter+"回");
            }
        });
        add(button);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    //×を押したときに終了するように
        pack();
        setVisible(true);    //可視化
    }
    public static void main(String[] args) {
        new GUIEvent03();
    }
}

外部クラスでイベント処理を実装

  • GUIEvent00
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package sample.swing.event;


import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class GUIEvent00 extends JFrame {
    private int counter;
    public GUIEvent00() {
        // フレーム関係の初期化
        setTitle("ボタンは一度も押されていません");
        // ボタンを追加
        JButton button = new JButton("このボタンを押すとタイトルの回数が変わります");
        button.addActionListener(new ButtonListener(this));
        add(button);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // ×を押したときに終了するように
        pack();
        setVisible(true); // 可視化
    }

    public void addCounter() {
        counter++;
        setTitle("ボタンを押した回数:" + counter + "回");
    }
    public static void main(String[] args) {
        new GUIEvent00();
    }
}
  • ButtonListener
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package sample.swing.event;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ButtonListener implements ActionListener {
    GUIEvent00 guiEvent00;
    public ButtonListener(GUIEvent00 event00) {
        this.guiEvent00 = event00;
    }
    public void actionPerformed(ActionEvent arg0) {
        guiEvent00.addCounter();
    }

}
ButtonListener.java GUIEvent00.java GUIEvent01.java GUIEvent02.java GUIEvent03.java

最終更新時間:2008年06月26日 08時49分14秒