JAVA入門

JAVA入門後期⑧
JAVAのSwingのイベント処理
Swingでのイベント処理
1.Swingでのイベント処理は、AWTのイベント処理をそのまま
使用する。従って、イベントリスナーを実装するクラスでは
import java.awt.event.*;
とインポートしなければならない。
(復習)アクションイベントとは
アプリケーションに対してユーザーの操作に対応した動作(アク
ション)を指定すること。即ち、JAVAプログラムではコンポーネ
ントにaddActionListener()等のメッソドによってイベントリスナー
を登録すること。
一方、アクションはイベントとしてコンポーネント(Event Source)
から受け取られ、対応した動作を記述したイベントリスナー
(Event Listner) に渡される。イベントはオブジェクトである。
従って、必要なイベントリスナーも別途実装する必要がある。
イベントの種類(抜粋)
イベントソース
イベントリスナー
ボタンクリック、テキストフィールドに
フォーカス中にReturnキー、メニュー項
目の選択
フレーム(メインウィンドウ)の終了
ActionListener
コンポーネントのクリック
MouseListener
コンポーネント上にマウスカーソルを移
動
MouseMotionListener
コンポーネントが可視化
ComponentListener
WindowListener
コンポーネントがキーボード入力に対し FocusListener
てフォーカス
テーブルやリストの選択が変更
ListSelectionListener
イベントリスナーの実装方法
1.自分自身がイベントリスナー
public class MyFrame extends JFrame
implements ActionListener {
……
}
のような形でクラスを作成する
2.イベントリスナークラスを別途作成
public class MyFrame extends JFrame {
……
}
public class MyEventListener implements ActionListener {
……
}
イベントリスナーの実装方法
3.イベントリスナークラスを内部クラスとして作成
public class MyFrame extends JFrame {
……
class MyEventListener implements ActionListener {
……
}
}
3の方法は、極小規模なプログラム向けであり、余り変更する
必要がない場合。
1の方法はもう少し大きなプログラム向けであり、やはり余り変
更する必要がない場合。
従って、中規模以上のプログラムや仕様変更等が想定される
プログラムでは、2の方法が用いられる。
イベント処理の例1
1.イベントソース側
import java.awt.*;
import javax.swing.*;
public class TaxCalc extends JFrame {
// 部品はプライベートで宣言しておく
private JFrame frame;
private JPanel north;
private JPanel center;
private JPanel south;
private JTextField amount;
private JButton submit;
private JButton reset;
private JTextField result;
イベント処理の例1
// コンストラクター
TaxCalc(String title) {
// JFrameのインスタンス化
frame = new JFrame(title);
// JPanelのインスタンス化
north = new JPanel();
center = new JPanel();
south = new JPanel();
// JTextFieldのインスタンス化
amount = new JTextField("0", 10);
amount.setHorizontalAlignment(JTextField.RIGHT);
result = new JTextField("0", 10);
result.setHorizontalAlignment(JTextField.RIGHT);
イベント処理の例1
// JButtonのインスタンス化
submit = new JButton("計算");
reset = new JButton("リセット");
// コンポーネントの追加
north.setLayout(new FlowLayout());
north.add(amount);
center.setLayout(new FlowLayout());
center.add(submit);
center.add(reset);
south.setLayout(new FlowLayout());
south.add(result);
イベント処理の例1
// イベントリスナーの登録
SubmitListener sl = new SubmitListener(amount, result);
submit.addActionListener(sl);
ResetListener rl = new ResetListener(amount, result);
reset.addActionListener(rl);
// JFrameのコンテントペインの取得
Container con = frame.getContentPane();
// コンテントペインにJPanel, JScrollPaneを配置
con.setLayout(new BorderLayout());
con.add(north, BorderLayout.NORTH);
con.add(center, BorderLayout.CENTER);
con.add(south, BorderLayout.SOUTH);
イベント処理の例1
// フレームのセットアップ
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
イベント処理の例1
2.イベントリスナー側(“計算”ボタンイベント処理)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SubmitListener implements ActionListener {
private JTextField amount;
private JTextField result;
SubmitListener(JTextField amount, JTextField result) {
this.amount = amount;
this.result = result;
}
イベント処理の例1
public void actionPerformed(ActionEvent e) {
int a = Integer.parseInt(amount.getText());
double d = a*1.05;
int r = (int)d;
result.setText(String.valueOf(r));
}
}
イベント処理の例1
2.イベントリスナー側(“リセット”ボタンイベント処理)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ResetListener implements ActionListener {
private JTextField amount;
private JTextField result;
ResetListener(JTextField amount, JTextField result) {
this.amount = amount;
this.result = result;
}
イベント処理の例1
public void actionPerformed(ActionEvent e) {
amount.setText("0");
result.setText("0");
}
}
イベント処理の例2
イベント処理を纏めてイベントリスナーを作成することも出来る。
このとき、イベントリスナー側では
getSource()メッソド
等によって、どのコンポーネントが発したイベントかを判定する。
注意:この方法では、イベントリスナー側もイベントが起こり得る
コンポーネントを把握しておかなければならない。
即ち、イベントリソース側とイベントリスナー側との情報の
遣り取り(インターフェース設計)を明確に規定する必要
がある。
イベント処理の例2
1.イベントソース側変更点
// イベントリスナーの登録
SubmitListener sl = new SubmitListener(amount, result);
submit.addActionListener(sl);
ResetListener rl = new ResetListener(amount, result);
reset.addActionListener(rl);
↓
// イベントリスナーの登録
EventHandler eh = new EventHandler(submit, reset,
amount, result);
submit.addActionListener(eh);
reset.addActionListener(eh);
イベント処理の例2
2.イベントリスナー側(二つのクラスを一つのクラスに纏める)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventHandler implements ActionListener {
private JButton submit;
private JButton reset;
private JTextField amount;
private JTextField result;
イベント処理の例2
EventHandler(JButton submit, JButton reset, JTextField
amount, JTextField result) {
this.submit = submit;
this.reset = reset;
this.amount = amount;
this.result = result;
}
イベント処理の例2
public void actionPerformed(ActionEvent e) {
// イベントの発生元をgetSource()メッソドで取得
if( e.getSource() == submit ) { // イベントがsubmitで発生
int a = Integer.parseInt(amount.getText());
double d = a*1.05;
int r = (int)d;
result.setText(String.valueOf(r));
} else if( e.getSource() == reset ) { // イベントがresetで発生
amount.setText("0");
result.setText("0");
}
}
}
実行結果