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"); } } } 実行結果
© Copyright 2024 ExpyDoc