イベント処理の実装方法

last modified: Jun./30th/2002; Jan./22nd/2002

前節でイベント処理の基本を紹介しました。そこでは、イベント処理の為に、イベントが発生するボタンをインスタンス化するパネルを別のクラスにして、イベント・リスナーを実装しました。

イベントリスナークラスの分離

イベントリスナーを別のクラスに分離して実装してみます。GUI アプリケーションとしては、金額を入力してボタンを押すと、5%加算された値が表示されるようにします。

TaxCalcurationの実行結果
図:TaxCalcuration の実行結果
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class TaxCalcuration {
	public static void main(String[] args) {
		JFrame frame = new JFrame("Tax Calcuration");
		MyCalcurationPanel panel = new MyCalcurationPanel();
		Container cont = frame.getContentPane();
		cont.add(panel);

		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

class MyCalcurationPanel extends JPanel {
	JButton submit, reset;
	JTextField amount, result;

	MyCalcurationPanel() {
		// eh オブジェクトに自分自身を登録
		EventHandler eh = new EventHandler(this);

		JPanel head = new JPanel();
		JPanel center = new JPanel();

		result = new JTextField(10);
		amount = new JTextField("0", 10);
		result.setHorizontalAlignment(JTextField.RIGHT);
		amount.setHorizontalAlignment(JTextField.RIGHT);

		submit = new JButton("計算");
		reset  = new JButton("リセット");

		head.add(amount);
		center.add(submit);
		center.add(reset);

		this.setLayout(new BorderLayout());
		this.add(head, BorderLayout.NORTH);
		this.add(center, BorderLayout.CENTER);
		this.add(result, BorderLayout.SOUTH);

		// イベントを eh オブジェクトに放る
		submit.addActionListener(eh);
		reset.addActionListener(eh);
	}
}

class EventHandler implements ActionListener {
	MyCalcurationPanel panel;

	EventHandler (MyCalcurationPanel mpanel) {
		panel = mpanel;
	}

	public void actionPerformed(ActionEvent ae) {
		if (ae.getSource() == panel.submit) {
			int i = Integer.parseInt(panel.amount.getText());
			double d = i * 1.05;
			int j = (int)d;
			panel.result.setText(String.valueOf(j));
		} else if (ae.getSource() == panel.reset) {
			panel.amount.setText("0");
			panel.result.setText("0");
		}
	}
}

実行結果:

C:\java>javac TaxCalcuration.java

C:\java>java TaxCalcuration

内部クラスでの実装

上の例ではイベント処理を別のクラスに分けました。多くの場合では、イベント処理を他のクラスに分ける場合、内部クラスとして実装します。

InnerTaxCalcuration.java:

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

class InnerTaxCalcuration {
	public static void main(String[] args) {
		JFrame frame = new JFrame("Tax Calcuration");
		MyCalcurationPanel panel = new MyCalcurationPanel();
		Container cont = frame.getContentPane();
		cont.add(panel);

		frame.pack();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

class MyCalcurationPanel extends JPanel {
	JTextField amount, result;
	JButton submit, reset;

	MyCalcurationPanel() {
		// 内部クラスのインスタンス化
		InnerEventHandler eh = new InnerEventHandler();

		JPanel head = new JPanel();
		JPanel center = new JPanel();

		result = new JTextField(10);
		amount = new JTextField("0", 10);
		result.setHorizontalAlignment(JTextField.RIGHT);
		amount.setHorizontalAlignment(JTextField.RIGHT);

		submit = new JButton("計算");
		reset  = new JButton("リセット");

		head.add(amount);
		center.add(submit);
		center.add(reset);

		this.setLayout(new BorderLayout());
		this.add(head, BorderLayout.NORTH);
		this.add(center, BorderLayout.CENTER);
		this.add(result, BorderLayout.SOUTH);

		// イベントを eh オブジェクトに放る
		submit.addActionListener(eh);
		reset.addActionListener(eh);
	}

	// 内部クラスによるイベントリスナー
	class InnerEventHandler implements ActionListener {

		public void actionPerformed(ActionEvent ae) {
			if (ae.getSource() == submit) {
				int i = Integer.parseInt(amount.getText());
				double d = i * 1.05;
				int j = (int)d;
				result.setText(String.valueOf(j));
			} else if (ae.getSource() == reset) {
				amount.setText("0");
				result.setText("0");
			}
		}
	}
}

実行例:

C:\java>javac InnerTaxCalcuration.java

C:\java>java TaxCalcuration

実行例は上のサンプルと同じです。



Copyright © 2001-2002 SUGAI, Manabu. All Rights Reserved.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送